SpringBoot 接入 JaCoCo 实践:代码覆盖率统计
概述
JaCoCo 是面向 Java 的开源代码覆盖率工具,以 Java 代理模式运行,负责在测试运行时检测字节码。JaCoCo 深入分析每个指令,显示测试过程中执行的行。为了收集覆盖率数据,JaCoCo 使用 ASM 即时进行代码检测,并从 JVM Tool Interface 接收事件,最终生成代码覆盖率报告。
接入
SpringBoot 可以通过两种主要方式接入 JaCoCo:Maven 和 Agent。Maven 方式是静态接入,在编译时计算代码覆盖率;Agent 方式是动态接入,服务启动后能实时根据代码命中情况计算覆盖率。
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>
使用以下命令生成报告:
mvn clean verify
Agent 方式
下载 jacoco 文件后解压,提取两个文件。使用命令启动 SpringBoot,启动参数添加 -javaagent:
java -javaagent:jacoco/jacocoagent.jar -jar target/mini-0.0.1-SNAPSHOT.jar
此时会生成一个 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%,说明接口调用命中了代码并被 JaCoCo 统计到。JavaAgent 相当于代理,在服务运行期间,所有调用都会经过 JavaAgent,从而实时统计代码覆盖率。只要服务运行起来,无论是跑单元测试、调接口还是手工测试,都能生成代码覆盖率数据。

