增量覆盖率报表实现

最近从QA那里接收到了一个需求,是对修改过的代码生成一个类似于Jacoco 的测试覆盖率报表,所以在此记录一下生成的步骤:

  • 配置Jacoco

    在JVM option中添加: -javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]即可。option有很多,我们这里只介绍一下我们配置的部分:

    • destfile:exec文件输出路径,默认是jacoco.exec

    • append: 如果设置为true并且执行数据文件已经存在,那么coverage数据将附加到现有文件中。如果设置为false,将替换现有的执行数据文件,就是每次会生成一个新的,一般是设为true,不然之前测试的coverage数据,server重启之后会丢失。默认true

    • output: 输出Coverage数据的方法:

      • file: 在虚拟机停止的时候会将数据写入到destfile指定的文件,我们目前指定是这个方法。

      • tcpserve:代理在由address和port属性指定的TCP端口上侦听传入连接。执行数据将写入此TCP连接

      • tcpclient:启动时,代理连接到由address和port属性指定的TCP端口。执行数据将写入此TCP连接。

      • none: 不产生任何输出

    • excludes:忽略的Class列表,使用冒号(:)分割,并且可以使用通配符(*和?)。除性能优化或技术特殊情况外,通常不需要此选项。 如果要从报告中排除类别,请相应地配置相应的报告生成工具。

  • 生成Coverage Report

    这里我们使用的是jacococli.jar 生成的,文档, 需要jacoco的版本大于0.8.0, 通过命令java -jar lib/jacococli.jar report 10_QA_Jacoco/jacoco_exec/*.exec --xml ./coverage.xml --sourcefiles 10_QA_Jacoco/**/src/main/java --classfiles 10_QA_Jacoco/from_server/oocl/即可生成coverage.xml。 Options的选项可以参考下面这个列表,我们生成的是xml文件,为了之后生成增量的覆盖率做准备。

    Option Description Required Multiple
    <execfiles> list of JaCoCo *.exec files to read
    --classfiles location of Java class files
    --csv output file for the CSV report
    --encoding source file encoding (by default platform encoding is used)
    --help show help
    --html output directory for the HTML report
    --name name used for this report
    --quiet suppress all output on stdout
    --sourcefiles location of the source files
    --tabwith tab stop width for the source pages (default 4)
    --xml output file for the XML report
  • 生成增量覆盖率报表

    这里使用了一个开源的工具diff-cover, 可以结合coverage.xml和git diff来得到新加行以及修改行的覆盖率报表。在项目目录下运行diff-cover coverage.xml --compare-branch=origin/tmscloud_release --html-report report.html --src-roots biz1/src/main/java biz2/src/main/java

    diff-cover 会比较当前分支和--compare-branch指定的分支从而得出修改的行,我们这里指定的release branch,从而得到上次版本之后修改的行。然后结合之前生成coverage.xml. 会生成一个html到--html-report指定的文件中,其中--src-roots指定源代码的相对路径,对于maven项目来说一定要制定到java这一层目录。命令运行完成之后会得到一个report。里面有一个table给出了每个文件修改行的覆盖率和未覆盖的行,后面还会打印出未覆行的代码。

覆盖率占比报表

红色未覆盖行
  • 显示未覆盖行的提交信息和提交者:

    上面报告完成之后,QA反馈说只显示了行号,没有显示修改行的提交信息(commit message)和提交人(committer)。所以就修改了一下diff-cover的源代码加了一下这两个内容。获取修改行的提交记录以及提交人可以使用命令git blame --incremental -L 20,+1:NtOrderUpdator.java详细这里就不说了,可以参考git的文档git blame,这个命令会打印出以下信息:

    d4a9bda57733fdbf7af8f24607a542a6f9ab74d4 18 20 4
    author Test
    author-mail <Test@oocl.com>
    author-time 1589878340
    author-tz +0800
    committer Tony
    committer-mail <Test@oocl.com>
    committer-time 1589878340
    committer-tz +0800
    summary ST245849
    filename NtOrderUpdator.java

其中的author就是我们需要的提交者,summary就是我们需要的提交信息,将其解析出来并应用于我们的html报表:

image.png

其中红色就是我们提交信息和提交人,后面紧跟着的就是对应修改行,这样我们就可以追踪未覆盖的修改行对应的stroy号以及修改人。