精准测试系列《五》

2022-07-04 21:13:41 浏览数 (1)

这是无量测试之道的第218篇原创

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

Step1: 前端页面的按钮
代码语言:javascript复制
<button class='btn btn-danger' id='getReport' align='center' onclick='getReport($(this))'>获取报告</button>

点击后调用 ajax 请求:

代码语言:javascript复制
function getReport(td) {
        var tr=td.parent().parent()
        console.log(tr);
        var tdlist=tr.find("td");
        console.log(tdlist);
        var id=$(tdlist[0]).find('input').val()
        console.log(id);
        if(id.length != 0) {
            var mymessage = confirm("确定现在获取报告吗?")
            if (mymessage == true) {
                $.ajax({
                    url:'/jacoco_getReport/' id,
                    type: 'GET',
                    dataType: 'json',
                    timeout: 4000,
                    cache: false,
                    beforeSend: function () {
                        $("#mainbody").html('<div align="center">获取报告执行中...</div>');

                    }, //加载执行方法
                    error: function () {
                        alert('数据加载失败!!!');
                    },  //错误执行方法
                    success: function () {
                        var time=3;
                        setInterval(function () {
                            if(time==0){
                                location.href="/jacoco_index/1"
                            }else{
                                $("#mainbody").html('<div align="center">报告生成中,<span id="sid">' time '</span>s 自动后返回</div>');
                                time--;
                            }
                        },1000);
                    }
                })
            }
        }
}
Step2: flask 路由规则为
代码语言:javascript复制
(r"/jacoco_getReport/(?P<id>d*)",JacocoGetReport),
Step3: flask 接收到 ajax 请求处理如下
代码语言:javascript复制
class JacocoGetReport(RequestHandler):
    def get(self,id):
        sql1 = "select uuid from jacoco_info where id="   str(id)
        sql2 = "select uuid from jacoco_info"
        db = conndb()
        result = db.get_data(sql1, sql2)
        uuid = result[0]['uuid']
        get_report(uuid)
        time.sleep(2)
        # sql3 = "update jacoco_info set cover_report='" report_urls "' where id="   str(id)
        sql3="update jacoco_info set job_status='SUCCESS',cover_status='SUCCESS'  where id="   str(id)
        print(sql3)
        db = conndb()
        db.execute_sql(sql3)
        data = {"meg": "success"}
        return self.write(data)

在这段处理代码中实际是调用了get_report(uuid) 的方法, 其代码如下:

代码语言:javascript复制
@async
def get_report(uuid):
    # 2)获取覆盖率结果
    test = HttpUtils()
    url = "http://10.7.36.35:9099/cov/getEnvCoverResult"
    data = {"uuid": uuid}
    content = test.httpGet(url, data)
    print("*")
    print(type(content))
    print(content['data'])
    print(content['data']['reportUrl'])
    global report_urls
    report_urls=content['data']['reportUrl']
Step4:从上面的 flask 处理过程中可以得知,又是通过调用了 super-jacoco 的接口去获取报告的,如下所示
代码语言:javascript复制
 url = "http://10.7.36.35:9099/cov/getEnvCoverResult"

我们在这里实际是调用到了 super-jacoco 的 controller 服务,其代码如下:

代码语言:javascript复制
/**
 * 获取功能测试增量代码覆盖率
 *
 * @param uuid
 * @return
 */
@RequestMapping(value = "/getEnvCoverResult", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
public HttpResult<CoverResult> getEnvCoverResult(@RequestParam(value = "uuid") String uuid) {
    return HttpResult.success(codeCovService.getCoverResult(uuid));

}

这里调用的 getCoverResult(uuid)方法代码如下:

代码语言:javascript复制
/**
 * 获取覆盖率结果
 *
 * @param uuid
 * @return
 */
@Override
public CoverResult getCoverResult(String uuid) {
    Preconditions.checkArgument(!StringUtils.isEmpty(uuid), "uuid不能为空"); //检查uuid参数是否为空
    CoverageReportEntity coverageReport = coverageReportDao.queryCoverageReportByUuid(uuid);//通过uuid获取到CoverageReportEntity对象
    CoverResult result = new CoverResult();//实例化覆盖率结果的对象
    if (coverageReport == null) { //如果获取到的coverageReport为空,就设置覆盖率结果的数据
        result.setCoverStatus(-1);
        result.setLineCoverage(-1);
        result.setBranchCoverage(-1);
        result.setErrMsg("uuid对应的报告不存在");
        return result;
    }

    try {
        BeanUtils.copyProperties(result, coverageReport);//复制coverageReport 到 result 上面
        String logFile = coverageReport.getLogFile().replace(LOG_PATH, LocalIpUtils.getTomcatBaseUrl());//获取日志文件的目录
        result.setLogFile(logFile);
        if (coverageReport.getRequestStatus() < Constants.JobStatus.SUCCESS.val()) {//如果获取到的报告状态值小于200
            result.setCoverStatus(0);//设置result对象的状态为0
            result.setErrMsg("正在统计增量覆盖率..."   Constants.JobStatus.desc(coverageReport.getRequestStatus()));//设置result对象的错误消息内容
        } else if (coverageReport.getRequestStatus() > Constants.JobStatus.SUCCESS.val()) {//如果获取到的报告状态值大于200
            result.setCoverStatus(-1);//设置result对象的状态为0
            result.setErrMsg("统计失败:"   coverageReport.getErrMsg());//设置result对象的错误消息内容
            result.setBranchCoverage(-1);//设置result对象的分支覆盖率为-1
            result.setLineCoverage(-1);//设置result对象的行覆盖率为-1
        } else {
            result.setCoverStatus(1);//设置result对象的状态为1
        }
        return result;//返回result 对象

    } catch (Exception e) {
        throw new ResponseException(e.getMessage());
    }
}

备注:

  1. java 代码中都对每一行有相应的注释说明,是在个人理解后写上的,大家可以在阅读源码时参考。
  2. 这里面有一个技术点就是对象的传递(对象的每次变更都会保留下来),代码中多次做为参数传递,然后相关的属性值经过 set 后又继续做后续的逻辑处理,这点大家要注意并理解。

end

0 人点赞