参考网上的教程,用jacoco统计代码覆盖率,需要用到jacoco和ant,我原来的计划也是jacoco和ant的方案,后来研究发现其实不用ant也可以实现,省去了ant的安装和配置,更加灵活方便。
相关软件下载:
Sudo Wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
sudo wget http://search.maven.org/remotecontent?filepath=org/jacoco/jacoco/0.8.5/jacoco-0.8.5.zip -O jacoco-0.8.5.zip
Sudo wget https://mirrors.tuna.tsinghua.edu.cn/apache//ant/binaries/apache-ant-1.9.14-bin.tar.gz
关于jacoco和ant的具体安装和环境变量配置过程这里就不多说了,自行百度
jacoco统计代码覆盖率原理及过程:
以springboot工程为例主要步骤为:
关键:在启动jar包时,启动命令指定jacocoagent.jar做为javaagent,实现对原jar包的动态插桩和收集代码执行数据
java - javaagent:${JACOCO_HOME}/lib/jacocoagent.jar=includes=*,output=tcpserver,port=6000,address=127.0.0.1 -jar demo2-0.0.1-SNAPSHOT.jar
此方案假设所有的步骤都在服务所运行的服务器上执行,其实收集数据和生成报告可以分离
为了方便运维部署操作,我打算写两个脚本
将下载下来的jacoco和ant软件包,以及2个安装脚本,build.xml模板组装成一个包,叫:jacoco-setup.tar,然后只要将这个包交给运维,经过简单的几步就可以完成jacoco在服务端的部署了
那么能不能不依赖ant?
进一步调研发现生成报告还有第三种方式
用jenkins的jacoco插件生成报告非常简单,这也是推荐用这种方式生成报告的原因,具体操作自行百度吧
用jacococli.jar生成report示例:
java -jar /usr/local/jacoco-0.8.5/lib/jacococli.jar report exec/*.exec --classfiles push-center/push-center-core/push-center-core-api/target/classes/ --html report
非常好,生成报告可以不依赖ant了,但是dump还是要依赖ant啊。
继续探索,jacoco支持三种方式output=file/tcpserver/tcpclient
考虑过采用output=file模式,输出到指定文件的方式,这种方式的优点是不依赖ant,但是缺点也很明显,需要kill服务进程来收集代码覆盖率数据。而kill服务进程又需要在服务器上执行,不利于将生成报告与采集数据解耦。
想到即然可以用用jacococli.jar生成report,那么用jacococli.jar是不是也有dump的命令,查了一下果真支持:
java -jar /usr/local/jacoco-0.8.5/lib/jacococli.jar --help
java -jar /usr/local/jacoco-0.8.5/lib/jacococli.jar dump --help
好了,如此一来完全不用再依赖ant就可以愉快的玩耍了。
启动服务:
java -javaagent:/opt/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=6001,address=192.168.0.201 -jar push-center-core-provider-1.0.1-SNAPSHOT.jar
java -javaagent:/opt/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=6002,address=192.168.0.201 -jar push-center-validation-provider-1.0.1-SNAPSHOT.jar
java -javaagent:/opt/jacoco/lib/jacocoagent.jar=includes=*,output=tcpserver,port=6003,address=192.168.0.201 -jar push-center-rest-api-1.0.1-SNAPSHOT.jar
dump数据:
java -jar /opt/jacoco/lib/jacococli.jar dump --address 192.168.0.201 --port 6001 --destfile exec/6001.exec --reset
java -jar /opt/jacoco/lib/jacococli.jar dump --address 192.168.0.201 --port 6002 --destfile exec/6002.exec --reset
java -jar /opt/jacoco/lib/jacococli.jar dump --address 192.168.0.201 --port 6003 --destfile exec/6003.exec --reset
生成报告:
# 编译源码,生成class文件
mvn compile -f push-center/pom.xml
# 删除以前的report
report_dir=report
if [ -d $report_dir ]; then
echo '删除之前的report:'$target_dir
rm -r $report_dir
fi
# 可以指定多个classfiles路径
classfiles=''
classfiles=$classfiles' --classfiles push-center/push-center-core/push-center-core-provider/target/classes'
classfiles=$classfiles' --classfiles push-center/push-center-validation/push-center-validation-provider/target/classes'
classfiles=$classfiles' --classfiles push-center/push-center-rest-api/target/classes'
# 可以指定多个sourcefiles路径
sourcefiles=''
sourcefiles=$sourcefiles' --sourcefiles push-center/push-center-core/push-center-core-provider/src/main/java'
sourcefiles=$sourcefiles' --sourcefiles push-center/push-center-validation/push-center-validation-provider/src/main/java'
sourcefiles=$sourcefiles' --sourcefiles push-center/push-center-rest-api/src/main/java'
# 使用jacococli.jar生成报告
java -jar /opt/jacoco/lib/jacococli.jar report exec/*.exec $classfiles $sourcefiles --encoding utf-8 --html report
另外,可以使用cli查看exec文件内容:
java -jar D:\jacococli.jar execinfo jacoco.exec
更多jacococli.jar的使用参考:https://www.eclemma.org/jacoco/trunk/doc/cli.html