为什么会关注Super-Jacoco ?
代码覆盖率,尤其是增量代码覆盖率,是质量门禁的重要指标之一。由于一些不可名状的原因,团队原先提供质量门禁服务的工具暂时停服了,因此需要另外寻找一个工具来代替提供此项服务。于是,笔者就Super-Jacoco做了一个简单的POC。
(增量)单元测试覆盖率统计实现过程分析
通常在网络上可见的介绍Super-Jacoco的文章主要是围绕系统测试的覆盖率统计来展开的,估计这也是这个工具的主要用户群体。而这个工具的手册中关于如何实现单元测试的介绍也非常简单,就是调用Super-Jacoco的两个接口
代码语言:javascript复制1、启动覆盖率收集
URL:/cov/triggerUnitCover
调用方法:POST
参数(body方式传入):{"uuid":"uuid","type":1,"gitUrl":"git@git","subModule":"","baseVersion":"master","nowVersion":"feature","envType":"-Ptest"}
返回:{"code":200,"data":true,"msg":"msg"}
备注:
2、获取覆盖率结果
URL:/cov/getUnitCoverResult
调用方法:GET
参数:uuid(String)
返回:{"code":200,"data":{"coverStatus":1,"errMsg":"msg","lineCoverage":100.0,"branchCoverage":100.0,"logFile":"file content","reportUrl":"http://"},"msg":"msg"}
备注:
第一个接口是启动收集,第二个接口是查询获得覆盖率结果。
看上去非常简单易用是不是?具体又是如何实现的呢?
笔者下载了Super-Jacoco的源码简单地进行了一下阅读分析,并尝试进行一下解读。
处理过程:
Super-Jacoco使用了很多的状态码来标志单测覆盖率分析任务的进展。除了阅读源码之外,可以通过状态码来了解整个任务的执行过程,见下图。
在客户端通过/cov/triggerUnitCover接口提交了单测覆盖率统计请求后,Super-Jacoco将新生成一个分析任务的记录存入数据库,并将其状态置为0-初始数据。
此后,一个定时触发的任务(10秒)将负责执行此单元测试任务,从状态1到9, 并在整体完成后将任务的状态置为200。
这样,客户端就可以通过/cov/getUnitCoverResult来根据uuid获取该次申请的执行结果了,也就是类似如下的内容
代码语言:javascript复制package com.xiaoju.basetech.entity;
import lombok.Data;
/**
* @description:
* @author: gaoweiwei_v
* @time: 2019/9/23 10:16 AM
*/
@Data
public class CoverResult {
/**
* -1、失败;1、成功;0、进行中
*/
private int coverStatus;
public String reportUrl;
private double lineCoverage;
private double branchCoverage;
private String errMsg;
private String logFile;
}
代码语言:javascript复制包括了代码行覆盖率和分支覆盖率这两个关键数据,以及覆盖率报告的下载链接和本次任务执行的日志文件的下载链接。
在从1到9的步骤中,Super-Jacoco使用到了哪些技术呢?从步骤上分析,可以看到需要完成以下的工作,
1、代码库下载、代码增量分析:这部分是关于Git操作的
2、添加模块:这是对pom.xml文件的操作,类似的操作文件还包括了对jacoco生成的覆盖率报告的解析。
3、单元测试执行:这是关于命令行执行的,需要执行类似”mvn clean test”的命令
将在下一篇中结合源码进行分析