基于Jira+Zephyr+钉钉的测试日报通知

基于Jira+Zephyr+钉钉的测试日报通知

实际工作中,采用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做跟踪和钉钉机器人的绑定:基于Jira+Zephyr+钉钉的测试日报通知

关注:测试领域专家(头条&微信)获取第一时间文章更新。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值