推荐一款 Java 代码覆盖率工具
什么是代码覆盖率?
代码覆盖率是指在软件测试过程中,测试用例执行源代码的比例。它反映了测试对代码的覆盖程度,即有多少代码被测试所执行。较高的代码覆盖率通常意味着更多的代码被测试过,有助于发现潜在的错误和问题,提高软件质量。
什么是 JaCoCo?
JaCoCo(Java Code Coverage)是一个用于 Java 项目的开源工具,可以测量 Java 程序的代码覆盖率,主要用于评估单元测试的效果。它提供了详细的执行报告,包括代码的哪些部分被测试覆盖,以及哪些没有被测试到。JaCoCo 支持多种构建工具,其中 Maven 是最常见的用途之一。
JaCoCo Maven 插件的安装与配置
在 Maven 项目中使用 JaCoCo 插件非常简单。您只需要将插件添加到项目的 pom.xml
文件中。以下是基本的配置示例:
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.12</version>
<configuration>
<!-- 排除特定的包或类 -->
<excludes>
<exclude>**/config/**</exclude>
<exclude>**/model/**</exclude>
<exclude>**/entity/**</exclude>
<exclude>**/dto/**</exclude>
</excludes>
</configuration>
<executions>
<!-- 准备阶段:初始化JaCoCo代理 -->
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<!-- 单元测试报告生成 -->
<execution>
<id>report</id>
<goals>
<goal>report</goal>
</goals>
<phase>verify</phase>
</execution>
<!-- 添加测试覆盖率检查 -->
<execution>
<id>jacoco-check</id>
<goals>
<goal>check</goal>
</goals>
<configuration>
<rules>
<rule implementation="org.jacoco.maven.RuleConfiguration">
<element>BUNDLE</element>
<limits>
<limit implementation="org.jacoco.report.check.Limit">
<counter>LINE</counter>
<value>COVEREDRATIO</value>
<minimum>0.80</minimum>
</limit>
<limit implementation="org.jacoco.report.check.Limit">
<counter>BRANCH</counter>
<value>COVEREDRATIO</value>
<minimum>0.70</minimum>
</limit>
<limit implementation="org.jacoco.report.check.Limit">
<counter>METHOD</counter>
<value>COVEREDRATIO</value>
<minimum>0.80</minimum>
</limit>
</limits>
</rule>
</rules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
详细说明
• version: 这里使用的是 JaCoCo 的最新稳定版本,你可以在 : https://www.jacoco.org/jacoco/trunk/doc/changes.html 页面找到最新的版本。
• prepare-agent: 这个目标会在测试运行之前准备 JaCoCo 的代理,监控代码执行。
• report: 此目标用于生成测试代码覆盖率报告。
执行测试并生成覆盖率报告
一旦您完成了 JaCoCo 插件的配置,就可以通过 Maven 命令执行单元测试并生成代码覆盖率报告。
mvn clean test
mvn jacoco:report
运行上述命令后,JaCoCo 将自动插入代理,并在测试完成后生成报告。报告通常生成在 target/site/jacoco/
目录下,包括 HTML 格式、XML 格式和其他格式供后续分析。
JaCoCo 生成的报告将展示代码覆盖率的详细信息,通常包括以下几项:
• 指令覆盖率: 测试用例实际执行的代码行与总代码行的比例。
• 分支覆盖率: 测试用例针对条件分支的执行情况。
• 行覆盖率: 每个代码行被测试用例执行的次数。
下图是 HTML 格式的报告:
各列的含义:
1. Element:元素名称,通常是包名或类名。
2. Missed Instructions:未被覆盖的指令数。
3. Cov.:覆盖率(Coverage),表示已执行的指令占总指令的比例。
4. Missed Branches:未被覆盖的分支数。
5. Cov.:覆盖率(Coverage),表示已执行的分支占总分支的比例。
6. Missed Cxty:未被覆盖的上下文数。
7. Missed Lines:未被覆盖的行数。
8. Missed Methods:未被覆盖的方法数。
9. Missed Classes:未被覆盖的类数。
表格格式报告
验证覆盖率
mvn clean verify
如果覆盖率不够会提示异常
最佳实践:集成 JaCoCo 到持续集成 CI/CD 流程
集成 JaCoCo 将有助于确保每个版本都达到预期的代码覆盖率。以下是一个示例,展示如何在 Jenkins 中集成 JaCoCo。
1. 创建新项目: 在 Jenkins 中创建一个新项目,选择合适的项目类型(如自由风格项目)。
2. 配置构建步骤: 在构建配置中添加 Maven 构建步骤,命令为
clean test
。3. 添加 JaCoCo 插件: 在 Jenkins 的插件管理中安装 JaCoCo 插件,并在构建后操作中配置报告生成路径。
示例 Jenkinsfile
如果您使用 Jenkins Pipeline,可以使用以下示例 Jenkinsfile 来集成 JaCoCo:
pipeline {
agent any
stages {
stage('Build') {
steps {
script {
// 执行 Maven 构建
sh 'mvn clean install'
}
}
}
stage('Test') {
steps {
script {
// 执行测试并生成覆盖率报告
sh 'mvn test'
}
}
}
stage('Report') {
steps {
script {
// 生成 JaCoCo 报告
sh 'mvn jacoco:report'
}
}
}
}
post {
always {
// 归档 JaCoCo 报告
archiveArtifacts artifacts: 'target/site/jacoco/**/*', allowEmptyArchive: true
}
}
}
通过这种方式,构建过程将生成代码覆盖率报告,方便团队持续监控测试效果。
欢迎关注我的公众号“编程与架构”,原创技术文章第一时间推送。