本文大纲

《我的敏捷软件项目管理实践》

代码覆盖率

第六章 如何做好编码

代码覆盖率理解

代码覆盖率(Code coverage)是软件测试中衡量测试用例对源代码覆盖程度的指标,通常以百分比形式表示。它通过分析测试执行时代码的行(语句覆盖)、分支(分支覆盖)、条件(条件覆盖)等维度的覆盖率,评估测试的全面性。例如,若测试执行了 90% 的代码行,则行覆盖率为 90%。这一指标适用于所有测试阶段,而不仅限于单元测试。

干货

  1. JUnit单元测试的代码覆盖率必须 >75% 方可进入持续集成流水线, 必须保证每个 if else分支都走到了。
  2. 在代码审查时,审查单元测试也是其中的一个环节,开发人员主动报告单元测试结果。

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的在单元测试阶段,生成代码覆盖率报告的流程

image2023-1-16_13-40-22.png

要生成代码覆盖率报告,有两个关键点:

  • 触发执行单元测试(插桩)
  • 触发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

截图:

image2023-6-10_10-31-13.png

通过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文件,就是的代码覆盖率报告文件。

image2023-6-10_11-10-12.pngimage2023-1-16_14-2-17.png

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

关于报告的格式后面会讲解。

image2023-1-16_14-17-56.png

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