精准测试系列《四》分享了如何通过测试管理平台进行代码覆盖率的统计,今天的分享内容是在发布平台进行获取覆盖率报告的逻辑,分享的大致思路还是从前端页面发起请求,然后后端接收到请求继续处理这样的逻辑来讲解。
<button class='btn btn-danger' id='getReport' align='center' onclick='getReport($(this))'>获取报告</button>
点击后调用 ajax 请求:
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);
}
})
}
}
}
(r"/jacoco_getReport/(?P<id>\d*)",JacocoGetReport),
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) 的方法, 其代码如下:
@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']
url = "http://10.7.36.35:9099/cov/getEnvCoverResult"
我们在这里实际是调用到了 super-jacoco 的 controller 服务,其代码如下:
/**
* 获取功能测试增量代码覆盖率
*
* @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)方法代码如下:
/**
* 获取覆盖率结果
*
* @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());
}
}
备注:
end