最近从QA那里接收到了一个需求,是对修改过的代码生成一个类似于Jacoco 的测试覆盖率报表,所以在此记录一下生成的步骤:
-
配置Jacoco
在JVM option中添加:
-javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]
即可。option有很多,我们这里只介绍一下我们配置的部分:destfile
:exec文件输出路径,默认是jacoco.execappend
: 如果设置为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 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
author-time 1589878340
author-tz +0800
committer Tony
committer-mail
committer-time 1589878340
committer-tz +0800
summary ST245849
filename NtOrderUpdator.java
其中的author就是我们需要的提交者,summary就是我们需要的提交信息,将其解析出来并应用于我们的html报表:
其中红色就是我们提交信息和提交人,后面紧跟着的就是对应修改行,这样我们就可以追踪未覆盖的修改行对应的stroy号以及修改人。