这是无量测试之道的第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());
}
}
备注:
- java 代码中都对每一行有相应的注释说明,是在个人理解后写上的,大家可以在阅读源码时参考。
- 这里面有一个技术点就是对象的传递(对象的每次变更都会保留下来),代码中多次做为参数传递,然后相关的属性值经过 set 后又继续做后续的逻辑处理,这点大家要注意并理解。
end