精准测试系列《五》
精准测试系列《四》分享了如何通过测试管理平台进行代码覆盖率的统计,今天的分享内容是在发布平台进行获取覆盖率报告的逻辑,分享的大致思路还是从前端页面发起请求,然后后端接收到请求继续处理这样的逻辑来讲解。
Step1: 前端页面的按钮
<button class='btn btn-danger' id='getReport' align='center' onclick='getReport($(this))'>获取报告</button>
点击后调用 ajax 请求:
1function getReport(td) { 2 var tr=td.parent().parent() 3 console.log(tr); 4 var tdlist=tr.find("td"); 5 console.log(tdlist); 6 var id=$(tdlist[0]).find('input').val() 7 console.log(id); 8 if(id.length != 0) { 9 var mymessage = confirm("确定现在获取报告吗?") 10 if (mymessage == true) { 11 $.ajax({ 12 url:'/jacoco_getReport/'+id, 13 type: 'GET', 14 dataType: 'json', 15 timeout: 4000, 16 cache: false, 17 beforeSend: function () { 18 $("#mainbody").html('<div align="center">获取报告执行中...</div>'); 19 20 }, //加载执行方法 21 error: function () { 22 alert('数据加载失败!!!'); 23 }, //错误执行方法 24 success: function () { 25 var time=3; 26 setInterval(function () { 27 if(time==0){ 28 location.href="/jacoco_index/1" 29 }else{ 30 $("#mainbody").html('<div align="center">报告生成中,<span id="sid">'+time+'</span>s 自动后返回</div>'); 31 time--; 32 } 33 },1000); 34 } 35 }) 36 } 37 } 38}
Step2: flask 路由规则为
(r"/jacoco_getReport/(?P<id>\d*)",JacocoGetReport),
Step3: flask 接收到 ajax 请求处理如下
1class JacocoGetReport(RequestHandler): 2 def get(self,id): 3 sql1 = "select uuid from jacoco_info where id=" + str(id) 4 sql2 = "select uuid from jacoco_info" 5 db = conndb() 6 result = db.get_data(sql1, sql2) 7 uuid = result[0]['uuid'] 8 get_report(uuid) 9 time.sleep(2) 10 # sql3 = "update jacoco_info set cover_report='"+report_urls+"' where id=" + str(id) 11 sql3="update jacoco_info set job_status='SUCCESS',cover_status='SUCCESS' where id=" + str(id) 12 print(sql3) 13 db = conndb() 14 db.execute_sql(sql3) 15 data = {"meg": "success"} 16 return self.write(data) 17
在这段处理代码中实际是调用了get_report(uuid) 的方法, 其代码如下:
1@async 2def get_report(uuid): 3 # 2)获取覆盖率结果 4 test = HttpUtils() 5 url = "http://10.7.36.35:9099/cov/getEnvCoverResult" 6 data = {"uuid": uuid} 7 content = test.httpGet(url, data) 8 print("*") 9 print(type(content)) 10 print(content['data']) 11 print(content['data']['reportUrl']) 12 global report_urls 13 report_urls=content['data']['reportUrl']
Step4:从上面的 flask 处理过程中可以得知,又是通过调用了 super-jacoco 的接口去获取报告的,如下所示
url = "http://10.7.36.35:9099/cov/getEnvCoverResult"
我们在这里实际是调用到了 super-jacoco 的 controller 服务,其代码如下:
1/** 2 * 获取功能测试增量代码覆盖率 3 * 4 * @param uuid 5 * @return 6 */ 7@RequestMapping(value = "/getEnvCoverResult", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) 8@ResponseBody 9public HttpResult<CoverResult> getEnvCoverResult(@RequestParam(value = "uuid") String uuid) { 10 return HttpResult.success(codeCovService.getCoverResult(uuid)); 11 12}
这里调用的 getCoverResult(uuid)方法代码如下:
1/** 2 * 获取覆盖率结果 3 * 4 * @param uuid 5 * @return 6 */ 7@Override 8public CoverResult getCoverResult(String uuid) { 9 Preconditions.checkArgument(!StringUtils.isEmpty(uuid), "uuid不能为空"); //检查uuid参数是否为空 10 CoverageReportEntity coverageReport = coverageReportDao.queryCoverageReportByUuid(uuid);//通过uuid获取到CoverageReportEntity对象 11 CoverResult result = new CoverResult();//实例化覆盖率结果的对象 12 if (coverageReport == null) { //如果获取到的coverageReport为空,就设置覆盖率结果的数据 13 result.setCoverStatus(-1); 14 result.setLineCoverage(-1); 15 result.setBranchCoverage(-1); 16 result.setErrMsg("uuid对应的报告不存在"); 17 return result; 18 } 19 20 try { 21 BeanUtils.copyProperties(result, coverageReport);//复制coverageReport 到 result 上面 22 String logFile = coverageReport.getLogFile().replace(LOG_PATH, LocalIpUtils.getTomcatBaseUrl());//获取日志文件的目录 23 result.setLogFile(logFile); 24 if (coverageReport.getRequestStatus() < Constants.JobStatus.SUCCESS.val()) {//如果获取到的报告状态值小于200 25 result.setCoverStatus(0);//设置result对象的状态为0 26 result.setErrMsg("正在统计增量覆盖率..." + Constants.JobStatus.desc(coverageReport.getRequestStatus()));//设置result对象的错误消息内容 27 } else if (coverageReport.getRequestStatus() > Constants.JobStatus.SUCCESS.val()) {//如果获取到的报告状态值大于200 28 result.setCoverStatus(-1);//设置result对象的状态为0 29 result.setErrMsg("统计失败:" + coverageReport.getErrMsg());//设置result对象的错误消息内容 30 result.setBranchCoverage(-1);//设置result对象的分支覆盖率为-1 31 result.setLineCoverage(-1);//设置result对象的行覆盖率为-1 32 } else { 33 result.setCoverStatus(1);//设置result对象的状态为1 34 } 35 return result;//返回result 对象 36 37 } catch (Exception e) { 38 throw new ResponseException(e.getMessage()); 39 } 40}
备注:
java 代码中都对每一行有相应的注释说明,是在个人理解后写上的,大家可以在阅读源码时参考。
这里面有一个技术点就是对象的传递(对象的每次变更都会保留下来),代码中多次做为参数传递,然后相关的属性值经过 set 后又继续做后续的逻辑处理,这点大家要注意并理解。
欢迎关注【无量测试之道】公众号,回复【领取资源】
Python编程学习资源干货、
Python+Appium框架APP的UI自动化、
Python+Selenium框架Web的UI自动化、
Python+Unittest框架API自动化、
资源和代码 免费送啦~
文章下方有公众号二维码,可直接微信扫一扫关注即可。
备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:大数据测试、功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:
添加关注,让我们一起共同成长!