本文大纲
《我的敏捷软件项目管理实践》
代码覆盖率
代码覆盖率理解
代码覆盖率(Code coverage)是软件测试中衡量测试用例对源代码覆盖程度的指标,通常以百分比形式表示。它通过分析测试执行时代码的行(语句覆盖)、分支(分支覆盖)、条件(条件覆盖)等维度的覆盖率,评估测试的全面性。例如,若测试执行了 90% 的代码行,则行覆盖率为 90%。这一指标适用于所有测试阶段,而不仅限于单元测试。
干货
- JUnit单元测试的代码覆盖率必须 >75% 方可进入持续集成流水线, 必须保证每个 if else分支都走到了。
- 在代码审查时,审查单元测试也是其中的一个环节,开发人员主动报告单元测试结果。
JaCoCo介绍
Java语言的代码覆盖率工具有:
- cobertura :停止维护,不支持java1.8的lamda表达式
- EMMA: 已停止维护
- JaCoCo :持续更新中 【选中】
- Clover: Clover(商用)
本篇文章主要介绍JaCoCo的使用。
JaCoCo是一个开源的代码覆盖率工具。
JaCoCo为基于Java VM的环境中的代码覆盖率分析提供标准技术。重点是提供一个轻量级,灵活且文档齐全的库,以与各种构建和开发工具集成。
- 基于Java字节码,因此无需源文件也可以工作
- 通过基于 Java-agent 的即时检测进行简单集成。
JaCoCo可以嵌入到 Ant 、Maven 中,并提供了 EclEmma Eclipse 插件,也可以使用 Java Agent 技术监控 Java 程序。很多第三方的工具提供了对 JaCoCo的集成,如 sonar、Jenkins、IDEA。
JaCoCo 可与我们将要使用的Sonar代码质量分析平台很好的配合。
核心流程
我们先看看JaCoCo的在单元测试阶段,生成代码覆盖率报告的流程

要生成代码覆盖率报告,有两个关键点:
- 触发执行单元测试(插桩)
- 触发JaCoCo生成代码覆盖率报告
原理:Jacoco对 Java 字节码进行插桩,所谓插桩就是在你编译的文件里面去插入Jacoco的探针,插桩之后,它会监控代码的使用情况,收集程序执行轨迹信息。
执行单元测试及生成报告
配置jacoco-maven-plugin插件
jacoco-maven-plugin 是 一个Maven插件,用于分析代码覆盖率(本文使用的是此时的最新版本)。
在工程的父POM文件中,加入以下插件配置。
<!-- JaCoCo 是一个开源的 Java 代码覆盖率分析工具,JaCoCo可以嵌入到 Ant 、Maven 中。很多第三方的工具提供了对 JaCoCo的集成,如 sonar、Jenkins 等。 -->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.8</version>
<executions>
<execution>
<id>pre-test</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>post-test</id>
<phase>test</phase> <!-- 是绑定maven生命周期的test阶段,在test阶段完后, 生成覆盖率报告。 -->
<goals>
<goal>report</goal>
</goals>
<configuration>
<outputDirectory>target/jacoco-site</outputDirectory> <!-- 这是输出目录 -->
</configuration>
</execution>
</executions>
</plugin>
Goals(目标)介绍:
prepare-agent goal: prepare-agent 准备 JaCoCo 运行时代理以记录执行数据。它记录了执行的行数、回溯的行数等。默认情况下,将执行数据写入文件target/jacoco-ut.exec。
report goal: 报告目标根据 JaCoCo 运行时代理记录的执行数据创建代码覆盖率报告。由于我们已经指定了阶段属性,报告将在测试阶段编译后创建。默认从文件中读取执行数据target/jacoco-ut.exec,将代码覆盖率报告写入目录target/site/jacoco/index.html。
report-aggregate goal:这个goal是jacoco 0.7.7版本以后,专门为Maven多模块覆盖率显示所设置,可以统计该模块所依赖的所有其他模块的覆盖率。达到多个模块的代码覆盖率汇总报告的目标。
check goal可以配置检查相关的设置,比如配置最低覆盖率为0.9(90%),如果覆盖率未达到最低限制,则mvn test会报错。
所有配置的Goals,详见官网https://www.eclemma.org/jacoco/trunk/doc/maven.html
其中比较常用的Goals是 prepare-agent、report和check
截图:

通过Maven指令执行单元测试
执行命令 mvn clean test会触发单元测试。就会生成覆盖率报告,因为在pom配置中已绑定到了Maven的test生命周期。
完整的命令是:
- mvn clean test org.jacoco:jacoco-maven-plugin:prepare-agent install
- mvn clean test org.jacoco:jacoco-maven-plugin:0.8.8:prepare-agent install -Dmaven.test.failure.ignore=true
- 其中,jacoco-maven-plugin 后面跟的是jacoco的版本。“-Dmaven.test.failure.ignore=true” 建议加上,否则如果单元测试失败,就会直接中断,不会产生 .exec 文件。
执行以上命令后,会在当前目录的 target 目录下产生一个jacoco.exec文件,生成的文件格式为.exec格式的二级制文件,该文件就是覆盖率分析的结果文件,解析.exec格式文件生成html格式代码覆盖率报告。
查看生成的代码覆盖率报告
当上面的Maven命令执行完成后,就生成了产生 .exec 文件、jacoco.xml文件和一批html文件,就是的代码覆盖率报告文件。


找到html文件,找到index.html,可以使用浏览器打开它,如下图,就是代码覆盖率报告 的详细内容。
关于报告的格式后面会讲解。

本次查看报告是在本地查看,就是在生成的地点查看。