• 精准测试系列《五》


    精准测试系列《四》分享了如何通过测试管理平台进行代码覆盖率的统计,今天的分享内容是在发布平台进行获取覆盖率报告的逻辑,分享的大致思路还是从前端页面发起请求,然后后端接收到请求继续处理这样的逻辑来讲解。

    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自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:

    添加关注,让我们一起共同成长!

    
    
  • 相关阅读:
    字节流
    A、B
    rollup
    使用nodejs提供动态javascript文件
    nodejs服务器部署
    A js 中加载Bjs

    01月05日22:14:32 学习进度笔记
    01月07日19:10:50 学习进度笔记
    01月07日18:53:49 学习进度笔记
  • 原文地址:https://www.cnblogs.com/Wu13241454771/p/15157013.html
Copyright © 2020-2023  润新知