网站首页 > 教程文章 正文
精准测试系列《四》分享了如何通过测试管理平台进行代码覆盖率的统计,今天的分享内容是在发布平台进行获取覆盖率报告的逻辑,分享的大致思路还是从前端页面发起请求,然后后端接收到请求继续处理这样的逻辑来讲解。
Step1: 前端页面的按钮
1<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 路由规则为
1(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 的接口去获取报告的,如下所示
1 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 后又继续做后续的逻辑处理,这点大家要注意并理解。
- 上一篇: javascript中location对象的用法
- 下一篇: 自动连接公共WIFI(一):连接方法分析
猜你喜欢
- 2024-12-01 Shopify模版编辑器问题排查及解决办法汇总
- 2024-12-01 JS实现防止别人通过控制台调试网站
- 2024-12-01 Web安全防范知识基础讲解
- 2024-12-01 「Shopify」屏蔽国内同行卖家访问网站
- 2024-12-01 避免网站中出现 index.html
- 2024-12-01 实现网页跳转的方法
- 2024-12-01 将 Safari 打造成 iOS 里的快速启动中心:Bookmarklet
- 2024-12-01 JMeter主要组件介绍(一)
- 2024-12-01 H5浏览器直接调起微信(url协议 weixin:// )判断是否安装微信
- 2024-12-01 HTTP GET如何在分页查询时传递中文参数值
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)