在 jacoco-maven-plugin
中,覆盖率阈值可以设置为行覆盖率(Line Coverage)和分支覆盖率(Branch Coverage),甚至可以设置类、方法、指令等不同类型的覆盖率。可以通过 check
目标对每个类型的覆盖率进行精细化控制。
行覆盖率 vs. 分支覆盖率
- 行覆盖率 (Line Coverage):表示测试执行中,代码的每一行是否被执行。
- 分支覆盖率 (Branch Coverage):表示控制流语句(如
if-else
、switch
)的所有分支是否被执行,包括 true 和 false 分支。
设置覆盖率阈值
jacoco-maven-plugin
提供了灵活的配置方式,可以针对不同类型的覆盖率(如行、分支、类等)设置阈值,并在代码未达到设定的覆盖率时使构建失败。
详细配置示例
下面是一个配置示例,包含行覆盖率和分支覆盖率的设置。
<build>
<plugins>
<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>
<execution>
<id>report</id>
<goals>
<goal>report</goal>
</goals>
</execution>
<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>
<!-- 设置分支覆盖率的最低阈值 -->
<limit>
<counter>BRANCH</counter>
<value>COVEREDRATIO</value>
<minimum>0.75</minimum> <!-- 分支覆盖率最低要求 75% -->
</limit>
</limits>
</rule>
</rules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
解释:
-
:
LINE
:代表行覆盖率,即代码每一行的覆盖情况。BRANCH
:代表分支覆盖率,即条件语句的分支覆盖情况。
-
:
COVEREDRATIO
:表示覆盖率的比例(即已覆盖/总量)。
-
:
- 用于设定最低覆盖率的阈值,如果覆盖率低于这个值,则构建失败。
其他覆盖率类型
除了行覆盖率和分支覆盖率,jacoco-maven-plugin
还允许针对其他指标设置阈值,例如:
- INSTRUCTION:指令覆盖率(字节码指令)。
- COMPLEXITY:代码复杂度覆盖率。
- METHOD:方法覆盖率。
- CLASS:类覆盖率。
示例:
<limits>
<limit>
<counter>METHOD</counter>
<value>COVEREDRATIO</value>
<minimum>0.85</minimum> <!-- 方法覆盖率最低要求 85% -->
</limit>
<limit>
<counter>CLASS</counter>
<value>COVEREDRATIO</value>
<minimum>0.90</minimum> <!-- 类覆盖率最低要求 90% -->
</limit>
</limits>
完整配置示例(行、分支、类、方法覆盖率)
<build>
<plugins>
<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>
<execution>
<id>report</id>
<goals>
<goal>report</goal>
</goals>
</execution>
<execution>
<id>check</id>
<goals>
<goal>check</goal>
</goals>
<configuration>
<rules>
<!-- 规则1:检测所有的包 -->
<rule>
<element>BUNDLE</element>
<limits>
<!-- 行覆盖率最低要求 80% -->
<limit>
<counter>LINE</counter>
<value>COVEREDRATIO</value>
<minimum>0.80</minimum>
</limit>
<!-- 分支覆盖率最低要求 75% -->
<limit>
<counter>BRANCH</counter>
<value>COVEREDRATIO</value>
<minimum>0.75</minimum>
</limit>
<!-- 方法覆盖率最低要求 85% -->
<limit>
<counter>METHOD</counter>
<value>COVEREDRATIO</value>
<minimum>0.85</minimum>
</limit>
<!-- 类覆盖率最低要求 90% -->
<limit>
<counter>CLASS</counter>
<value>COVEREDRATIO</value>
<minimum>0.90</minimum>
</limit>
</limits>
</rule>
</rules>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
使用技巧和最佳实践
-
动态调整阈值:根据项目的不同阶段和实际需要,可以动态调整不同的覆盖率阈值。例如,在早期项目中可能会设定较低的覆盖率要求(如 50%),随着项目的成熟再提高到 80% 或更高。
-
逐步提升覆盖率:如果项目初期覆盖率不高,可以逐步提升覆盖率标准,使用工具如 SonarQube 或 CI 系统来监控覆盖率的提升过程。
-
排除不必要的类:对于一些生成的代码或第三方库,可以通过
excludes
将它们排除在覆盖率统计之外,确保报告准确反映实际开发代码的覆盖情况。
总结
- 设置覆盖率阈值:
jacoco-maven-plugin
提供了灵活的覆盖率阈值配置,支持行覆盖率和分支覆盖率的设置。通过check
目标可以根据项目需求定义最低标准,确保代码质量。 - 详细配置:行覆盖率、分支覆盖率、方法覆盖率、类覆盖率等指标都可以单独设定阈值,灵活控制构建流程中的覆盖率标准。
- 实践应用:通过逐步提升覆盖率阈值,结合 CI/CD 工具进行自动化检测,可以有效保证代码的质量和可测试性。
通过这些配置和实践建议,你可以轻松配置和使用 Jacoco 进行全面的代码覆盖率管理。