jacoco原理:
主流代码覆盖率工具都采用字节码插桩模式,通过钩子的方式来记录代码执行轨迹信息。其中字节码插桩又分为两种模式On-The-Fly和Offine。On-The-Fly模式优点在于无需修改源代码,可以在系统不停机的情况下,实时收集代码覆盖率信息。
流程:
1、 下载jacocoagent.jar
2、 将jacocoagent.jar放在某目录下
3、 Tomcat在bin目录下新建setenv.sh文件,
内容如下:export
CATALINA_OPTS="-javaagent:/home/apache-tomcat/jacocoagent.jar=destfile=/home/apache-tomcat/DS_cover/jacoco.exec,output=tcpserver,port=XXX,address=XXX"
4、 启动tomcat
5、 在构建服务器上,即sonarqube所在服务器上新建任意目录,将sonar-project.properties和jacoco_tcp.jar以及jacoco_XXX.sh放入
其中sonar-project.properties形如:
sonar.sources=src/main/java
sonar.binaries=target/classes
sonar.language=java
#Tells
SonarQube where the integration tests code coverage report is
sonar.jacoco.itReportPath=/home/XXX/jacoco-it.exec
sonar.jacoco.reportPath=/home/XXX/jacoco.exec
#
Encoding of the source files
sonar.sourceEncoding=UTF-8
用来指定class和源码位置,否则执行的时候会报找不到class文件
jacoco_tcp.jar则是用来获得远程位置的jacoco.exec文件,因为一般sonarqube和测试服务不部署在一起,代码可以参考jacoco官网上的example
7、创建jacoco_XXX.sh,shell脚本的内容**:
将sonar-project.properties文件复制到各个项目根目录,指定项目代码及classes文件位置;
执行jacoco_DSWeb.jar该jar**从远程开放的端口循环获取覆盖率报告文件jacoco.exec,之后将其与第一次获取的jacoco-it.exec进行对比,若大小不一致,则证明覆盖率出现了变化,新的jacoco.exec覆盖jacoco-it.exec;
之后执行mvn命令解析指定位置的jacoco-it.exec
本人shell水平有限,就不拿来献丑了
8、修改sonar中对应项目的配置,将jacoco的集成测试覆盖率报告路径配置改为/home/XXX/jacoco-it.exec
9、赋予jacoco_XXX.sh脚本运行权限,执行命令nohup sh jacoco_XXX.sh &
10、进行集成测试(手动或自动化)
11、在sonarqube中即可查看集成测试覆盖率
优点:
1、集成性强,通过sonarqube直接集成对源码和覆盖率的查看
2、Jacoco脱胎于EMMA,工具新
3、实时能够监控代码覆盖率,不需要先停止tomcat