实际工作中,采用Jira做项目管理,Zephyr做测试管理,钉钉做工作沟通,是常见的搭配方式。以往在项目提测之后,我们会要求测试人员每日在钉钉群发送日报,更新测试进度、待解决的问题,尤其是P0、P1级bug,工作量虽然不大,但是如能实现测试日报的自动发送,无疑能更进一步提高生产力。这里我们可以使用jira-client、zapi已经钉钉提供的api实现上述功能。
关键技术
- jira-client的pom:
<!-- https://mvnrepository.com/artifact/net.rcarz/jira-client -->
<dependency>
<groupId>net.rcarz</groupId>
<artifactId>jira-client</artifactId>
<version>0.5</version>
</dependency>
这个是原作者的pom,各位如需扩展,可以从github下载后自己更新,代码比较简单。本人后续开源。
- jira安装zapi插件,改插件是免费的,其api地址参见:https://getzephyr.docs.apiary.io/#reference/stepresultresource/create-new-stepresult/create-new-stepresult,都是基本的rest api,各位可以自行封装。本人后续开源。
- 钉钉机器人的的api地址,参考:https://open-doc.dingtalk.com/microapp/serverapi2/qf2nxq。各位可以使用钉钉提供的sdk或者自行调用webhook进行消息发送
关键实现
- 首先是在提测之后进行消息的发送,平时是不用发的。我们使用jira的version也就是release做版本管理,产品定好release的封板或者上线日期之后(我们是2周一迭代),倒推3个工作日作为提测也就是开始测试的时间,所以程序根据release date反算开始发送日报的日期,然后使用springboot的scheduler做定时发送,关键代码如下:
/**
* 当前测试版本的日报
* 版本处于 测试中 状态,而且token不为空
* 仅工作日执行
*/
@Scheduled(cron = "0 22 19 ? * 2,3,4,5,6")
public void dailyReportInVersion() throws Exception{
for(JiraVersionEntity jiraVersionEntity : jiraVersionRepository.findByTestStartDateLessThanEqualAndCurrentStatusInAndDingdingIsNotNull(LocalDate.now().toString(), Arrays
.asList(new String[]{"开发中","测试中"}))){
dailyReportInVersion(jiraVersionEntity);
}
}
- 报告发送的截止日期,为release更改为archive(我们约定archive为封板或者上线状态)状态
- 每日发送的日报,包括两个部分:缺陷状态和测试进度
- 缺陷状态主要使用jira-client的api遍历本release中所有的bug,关键代码如下:
/**
* 本次迭代当前未解决的缺陷
* @param versionId
* @return
* @throws Exception
*/
public String unresolvedIssueInVersion(String title, int versionId) throws Exception{
String jql = "issuetype = 故障 and fixVersion = " + versionId + " AND resolution = Unresolved ORDER BY priority DESC";
Iterator<Issue> iterator = jiraClient.searchIssues(jql).iterator();
List<Issue> list = new ArrayList<>();
while(iterator.hasNext()){
Issue issue = iterator.next();
list.add(issue);
}
String content = DingdingMarkdownIssue.getDingdingMarkdown(list, title);
return content;
}
- 测试进度主要使用zapi遍历每个用例的状态,此处我们在使用zephy做plan cycle时,选定的release即为本次迭代:
/**
* 当前release的测试执行执行状态
* @param projectId
* @param versionId
* @throws Exception
*/
public String testStatusInVersion(String title, int projectId, int versionId) throws Exception{
int total = 0;
int passed = 0;
int failedOrBlocked = 0;
int wip = 0;
int unattempted = 0;
CycleResource cycleResource = new CycleResource(jiraUrl, jiraUser, jiraPass);
ExecutionResource executionResource = new ExecutionResource(jiraUrl, jiraUser, jiraPass);
for(ListCycleResultEntity entity : cycleResource.listCycle(projectId, versionId)){
total += entity.getTotalCycleExecutions();
List<ExecutionEntity> executionEntityList = executionResource.executionList(projectId, entity.getCycleId());
for(ExecutionEntity execution : executionEntityList){
int executionStatus = Integer.valueOf(execution.getExecutionStatus());
if(executionStatus == ExecutionStatus.PASS.getStatus()){
passed ++;
}
else if(executionStatus == ExecutionStatus.FAIL.getStatus() || executionStatus == ExecutionStatus.BLOCK.getStatus()){
failedOrBlocked ++;
}
else if(executionStatus == ExecutionStatus.WIP.getStatus()){
wip ++;
}
else {
unattempted ++;
}
}
}
String info = String.format("总共%d条用例,成功%d条,失败或者阻碍%d条,测试中%d条,未执行%d条", total, passed, failedOrBlocked, wip, unattempted);
return new DingdingMarkdown(title, info).toString();
}
- 这样,我们日报里核心的缺陷和测试进度内容获取完毕,剩下的就是调用钉钉进行发送即可。
扩展
- 实际落地过程中,我们是提供了web ui用于查看jira所有的release做跟踪和钉钉机器人的绑定:
关注:测试领域专家(头条&微信)获取第一时间文章更新。