super-jacoco单元测试覆盖率度量实践-1

2022-02-08 10:57:33 浏览数 (1)

为什么会关注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”的命令

将在下一篇中结合源码进行分析

0 人点赞