jacoco-maven-plugin使用
jacoco-maven-plugin
是用于分析 Java 代码覆盖率的工具,它可以集成到 Maven 构建生命周期中,为单元测试、集成测试生成详细的覆盖率报告。以下是全面的讲解,涵盖主要功能的详细用法、示例代码、常见的使用技巧和一些高阶功能。
主要功能及详细使用
-
准备覆盖率数据:
prepare-agent
通过prepare-agent
目标,Jacoco 插件会在 JVM 中注入一个代理,以便在测试期间收集覆盖率数据。它是必须的步骤,用于在后续生成覆盖率报告。配置示例:
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.10</version> <executions> <execution> <id>prepare-agent</id> <goals> <goal>prepare-agent</goal> </goals> </execution> </executions> </plugin>
- 作用:确保 JVM 在运行测试时记录覆盖率数据。
- 结果:生成
.exec
文件,存储了覆盖率信息,默认路径为target/jacoco.exec
。
-
生成覆盖率报告:
report
report
目标会使用prepare-agent
生成的.exec
文件,结合源码和编译后的字节码,生成详细的覆盖率报告,支持多种格式(HTML、XML、CSV)。配置示例:
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.10</version> <executions> <execution> <id>report</id> <goals> <goal>report</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/jacoco</outputDirectory> <formats> <format>HTML</format> <format>XML</format> </formats> </configuration> <phase>verify</phase> </execution> </executions> </plugin>
- 作用:生成测试覆盖率的可视化报告。
- 结果:在
target/site/jacoco
目录下生成 HTML 报告(index.html
)及 XML 报告。 - 常用格式:
HTML
:用于人类阅读的报告,包含图表和详细的覆盖率信息。XML
:可以用于集成工具(如 SonarQube)。CSV
:提供原始的覆盖率数据,用于自定义分析。
-
合并多模块的覆盖率报告:
report-aggregate
对于多模块项目,Jacoco 提供了report-aggregate
目标,用于将多个模块的覆盖率数据合并生成一份报告。配置示例:
在父
pom.xml
中添加jacoco-maven-plugin
的配置:<build> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.10</version> <executions> <execution> <id>report-aggregate</id> <goals> <goal>report-aggregate</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
- 作用:将子模块的测试覆盖率合并,生成一份聚合报告。
- 结果:在父项目的
target/site/jacoco-aggregate/
生成合并后的覆盖率报告。
-
设置覆盖率阈值:
check
check
目标可以设定代码覆盖率的阈值,如果不满足要求,构建会失败。这对于确保代码质量非常有用。配置示例:
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.10</version> <executions> <execution> <id>check</id> <goals> <goal>check</goal> </goals> <configuration> <rules> <rule> <element>BUNDLE</element> <limits> <limit> <counter>LINE</counter> <value>COVEREDRATIO</value> <minimum>0.80</minimum> <!-- 最低要求 80% --> </limit> </limits> </rule> </rules> </configuration> </execution> </executions> </plugin>
- 作用:定义测试覆盖率的最低阈值标准。
- 结果:当代码覆盖率低于 80% 时,构建失败。
详细使用流程
-
添加插件到
pom.xml
:
根据需求,配置prepare-agent
和report
目标。 -
运行测试:
运行命令mvn clean verify
,Maven 会在运行测试时自动启动 Jacoco 代理并生成覆盖率数据。 -
查看报告:
在target/site/jacoco/
下查看生成的报告。可以直接打开 HTML 文件查看详细的覆盖率信息。
使用技巧和高阶功能
1. 跳过测试和报告生成
在某些情况下,你可能希望跳过测试或跳过生成覆盖率报告,可以通过以下方式:
- 跳过测试:
mvn clean install -DskipTests
- 跳过 Jacoco 覆盖率报告:
mvn clean install -Djacoco.skip=true
2. 生成不同格式的报告
根据需求生成不同格式的报告,可以同时配置多个格式,常见格式包括 HTML
, XML
, 和 CSV
。例如:
<formats>
<format>HTML</format>
<format>XML</format>
</formats>
- HTML:适合人类阅读,包含图表和详细信息。
- XML:用于与 SonarQube 集成进行进一步代码分析。
- CSV:可以将数据导入到自定义的分析工具中。
3. 多模块项目中的覆盖率合并
如果项目是多模块结构,可以使用 report-aggregate
目标合并各模块的覆盖率数据。确保父 pom.xml
中配置了该插件,并在子模块中收集到 .exec
文件。
4. 集成到 CI/CD 流程
在 Jenkins、GitLab CI 等 CI/CD 工具中,jacoco-maven-plugin
可用于自动化代码覆盖率报告生成并进行质量门槛检查。例如,在 Jenkins Pipeline 中:
stage('Test') {
steps {
sh 'mvn clean verify'
}
}
stage('Jacoco Report') {
steps {
jacoco execPattern: '**/target/jacoco.exec'
}
}
5. 排除特定包或类
如果有某些类或包不需要参与覆盖率分析,可以通过 excludes
来排除它们。例如:
<configuration>
<excludes>
<exclude>com/example/legacy/**</exclude>
</excludes>
</configuration>
- 作用:跳过对某些类或包的覆盖率统计,常用于第三方库或遗留代码。
总结
- 基本功能:
jacoco-maven-plugin
提供了prepare-agent
和report
两个核心目标,分别用于准备覆盖率数据和生成报告。 - 合并报告:多模块项目可以使用
report-aggregate
目标将多个模块的覆盖率数据合并。 - 覆盖率检查:通过
check
目标,可以设定覆盖率的最低要求,确保代码质量。 - 高级功能:可以与 CI/CD 工具集成、排除特定类、生成多种格式的报告等。
常用命令总结:
mvn clean verify
:运行测试并生成覆盖率报告。mvn clean install -Djacoco.skip=true
:跳过生成覆盖率报告。
通过这些配置和使用技巧,你可以轻松集成 Jacoco 并根据项目需求调整配置。