Jacoco 单测覆盖统计工具
基础概念
行覆盖率:度量被测程序的每行代码是否被执行,判断标准行中是否至少有一个指令被执行。
类覆盖率:度量计算class类文件是否被执行。
分支覆盖率:度量if和switch语句的分支覆盖情况,计算一个方法里面的总分支数,确定执行和不执行的 分支数量。
方法覆盖率:度量被测程序的方法执行情况,是否执行取决于方法中是否有至少一个指令被执行。
指令覆盖:计数单元是单个java二进制代码指令,指令覆盖率提供了代码是否被执行的信息,度量完全 独立源码格式。
圈复杂度:在(线性)组合中,计算在一个方法里面所有可能路径的最小数目,缺失的复杂度同样表示测 试案例没有完全覆盖到这个模块。
https://www.jianshu.com/p/639e51c76544
解决方案
Jacoco 简介
JaCoCo(Java Code Coverage)是一个开源的 Java 代码覆盖率统计工具,广泛应用于单元测试、集成测试等场景。它通过字节码插桩技术,动态分析代码执行路径,生成覆盖率报告,帮助开发者评估测试用例的完整性。
Jacoco 核心功能
- 行覆盖率(Line Coverage):统计代码行是否被执行。
- 分支覆盖率(Branch Coverage):统计条件分支(如
if/else)是否被覆盖。 - 方法覆盖率(Method Coverage):统计方法是否被调用。
- 类覆盖率(Class Coverage):统计类是否被加载并执行。
JaCoCo version 0.7.7 implemented a new maven goaljacoco:report-aggregate.
https://www.eclemma.org/jacoco/trunk/doc/report-aggregate-mojo.html
需要额外添加一个子工程『cov』,该工程只有pom文件,文件中引用所有的subProject,并进行jacoco相应的配置(主要是outputDirectory目录)。
编译命令 mvn verify -Pjacoco
<parent> <artifactId>parentProject</artifactId> <groupId>com.jacoco.multimodule.test</groupId> <version>${parent-version}</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.jacoco.multimodule.test</groupId> <artifactId>cov</artifactId> <version>1.0</version> <packaging>pom</packaging> <properties> <maven.deploy.skip>true</maven.deploy.skip> </properties> <profiles> <profile> <id>jacoco</id> <activation> <activeByDefault>false</activeByDefault> </activation> <build> <plugins> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <executions> <execution> <id>default</id> <phase>verify</phase> <goals> <goal>report-aggregate</goal> </goals> <configuration> <outputDirectory>${project.basedir}/../target/site/jacoco</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles> <!-- add project module info as below --> <dependencies> <dependency> <groupId>com.jacoco.multimodule.test</groupId> <artifactId>subProject1</artifactId> </dependency> <dependency> <groupId>com.jacoco.multimodule.test</groupId> <artifactId>subProject2</artifactId> </dependency> </dependencies> </project>Gradle 集成
在build.gradle中添加 JaCoCo 插件:
plugins { id 'jacoco' } jacoco { toolVersion = "0.8.8" } test { finalizedBy jacocoTestReport } jacocoTestReport { reports { xml.required = true html.required = true } }报告默认生成在build/reports/jacoco/目录。
Jacoco 报告解读
- HTML 报告:可视化展示覆盖率详情,包括代码高亮和未覆盖行标记。
- XML 报告:适用于与 CI/CD 工具(如 Jenkins、SonarQube)集成。
- CSV 报告:结构化数据,便于进一步分析。
Jacoco 与 CI/CD 集成
- Jenkins:通过 JaCoCo 插件解析报告,并在流水线中设置质量门禁。
- SonarQube:上传 JaCoCo 报告至 SonarQube,实现静态分析与覆盖率结合。
Jacoco 常见问题
- 覆盖率不准确:检查是否跳过测试(如
-DskipTests)或未正确配置插桩。 - 报告未生成:确认插件版本兼容性及执行阶段是否正确绑定。
- 性能影响:字节码插桩可能轻微增加测试时间,建议仅在需要时启用。
参考资源
- 官方文档:JaCoCo 官网
