本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。
静态接入和动态接入
SpingBoot 可以通过 2 种方式接入 JaCoCo:Maven 和 Agent。Maven 方式是静态接入,在编译时计算代码覆盖率。Agent 方式是动态接入,服务启起来以后,能实时根据代码命中情况计算代码覆盖率。
教程代码已上传开源项目:https://github.com/dongfanger/mini
Maven
pom.xml 添加依赖:
<dependency>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.7</version>
</dependency>
添加配置:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${project.parent.version}</version>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.7</version>
<executions>
<execution>
<id>default-prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>default-report</id>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
点击 maven 的 install:

target/site/jacoco目录下就生成了覆盖率报告:


Agent
下载 jacoco 文件后解压,提取 2 个文件:

使用命令启动 SpringBoot,启动参数添加-javaagent:
java -javaagent:jacoco/jacocoagent.jar -jar target/mini-0.0.1-SNAPSHOT.jar
此时会生成 1 个jacoco.exec文件,这个文件就是覆盖率数据文件,采用以下命令根据数据文件生成 HTML 报告:
java -jar jacoco/jacococli.jar report jacoco.exec --classfiles ./target/classes/ --sourcefiles ./src/main/java/ --html ./report


接下来就来验证动态特性。把 report 目录和jacoco.exec都删了,因为jacoco 每次部署只能分析一次。把服务停掉后,重新启动。这一次不直接分析,而是先用 postman 调一下接口:

然后再分析一把:

可以看到覆盖率变成 100%,说明 postman 调接口这个操作,命中了代码,被 jacoco 统计到了。javaagent 相当于是个代理,在服务运行期间,所有调用都会经过 javagent,这样就能实时统计代码覆盖率。换句话说,只要服务运行起来以后,只要你能命中代码,无论是跑单元测试还是调接口,或者是手工测试,都能生成代码覆盖率数据。