关于单元测试以及本文Calculate类等内容,请见前述文章Junit单元测试_Joy T的博客-CSDN博客
要学Jacoco,首先要知道测试覆盖率是什么!
测试覆盖率
测试覆盖率表示的是测试用例所能触及(或“覆盖”)的代码百分比。换句话说,它显示了你的测试用例运行时实际执行的代码量与总代码量的比例。
如果是那种极简的输入输出的测试,本质上什么也没干的,没有牵动调用业务代码的,都不会考虑进入测试覆盖率的计算当中。
以下是一些关键点:
行覆盖率:这是最常用的指标,表示测试用例执行了多少百分比的代码行。
分支覆盖率:这表示测试用例覆盖了代码中多少百分比的决策点或分支(例如,
if
和switch
语句)。类和方法覆盖率:这表示测试用例覆盖了代码中多少百分比的类和方法。
但需要注意的是,虽然覆盖率是一个有用的指标,但它不能完全表示测试的质量。有时候,即使覆盖率很高,也可能遗漏了一些关键的、边缘的或错误的情况。所以,除了追求高的测试覆盖率,还要确保测试用例的质量和完整性,确保它们确实检测到可能的错误和异常情况。
过度依赖测试覆盖率很容易陷入以下几个陷阱:
盲目追求100%覆盖率:有时,追求100%的覆盖率可能导致开发者为了增加覆盖率而编写无意义或低价值的测试,这些测试并不真正检查应用的正确性或关键功能。
忽视测试质量:测试覆盖率不会告诉你测试的质量。一个测试可能覆盖了很多代码,但如果它没有合理的断言和逻辑判断,那么这个测试的价值可能很低。
错过关键路径:仅仅因为代码被覆盖并不意味着所有的执行路径或业务逻辑都已被测试。可能存在未被测试的复杂场景或边缘案例。
产生误导:一个非常高的测试覆盖率可能会给团队带来过分的自信,使他们认为软件是没有缺陷的。但实际上,可能仍然存在未被发现的问题。
降低开发效率:如果开发者过于关注覆盖率,他们可能会花费大量时间编写和维护不那么重要的测试,而忽视了更有价值、更关键的测试。
简而言之,测试覆盖率可以帮助你发现可能遗漏的测试区域,但不能完全代替对测试质量的判断。
Jacoco前言
Jacoco 是 Java 代码覆盖率的一个非常流行的工具,它可以用来测量项目中代码的覆盖率。作者在网上学习过程中发现一些问题:
大部分 Jacoco 对于Springboot项目的使用流程是:需要项目打包成jar包,然后启动一个agent监听。然后通过Postman这样的工具去测试,这里测试的应该是接口测试。Jacoco能不能看到单元测试的测试覆盖率呢?另外,如果使用Jacoco监听接口测试,需要把所有的测试都做一遍才能最后生成测试报表吧?
-
使用JaCoCo是否需要打包成JAR:
- 不一定。可以在 IDE 中直接查看单元测试的覆盖率,或者通过 Maven/Gradle 的 Jacoco 插件在构建过程中生成覆盖率报告。但如果你想查看集成测试或手工测试的覆盖率,那么通常需要以 agent 的方式启动应用,并在测试结束后生成报告。
- 上面两种查看单元测试的覆盖率方法作者都会在下文讲解。
-
JaCoCo 能否查看单元测试的覆盖率:
- 能。JaCoCo 可以查看单元测试、集成测试或其他任何形式测试的代码覆盖率。
-
使用 JaCoCo 监听接口测试:
- 如果使用 JaCoCo 的 agent 来监听接口测试,需要运行所有相关的接口测试来确保覆盖率报告的准确性。只有当你运行了所有的测试,你才能得到一个完整的覆盖率报告。
- 作者还没有尝试Springboot的测试,本文以maven项目简单的单元测试为例。
直接在IDEA中查看测试覆盖率
在测试类中右键,有一个More Run\Debug,选中第一个...Coverage,项目会重新测试一遍并计算得到测试覆盖率,其示意图如下:
Class 类覆盖率、Method 方法覆盖率、Line 行覆盖率。没啥技术含量,而且如果涉及到整个项目的接口测试就看不出来什么了,对于简单看看单元测试来说,还是挺好用的一个方法。
Maven项目中配置Jacoco插件
Pom.xml文件配置
作者不清楚什么版本,反正学什么东西都别下最新版的,首先要在pom.xml文件中配置插件信息:
<build>
<plugins>
<!-- ... 其他的插件 ... -->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.7</version> <!-- 这是截止到我知识更新日期的最新版本,你可以检查是否有更新 -->
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<!-- attached to Maven test phase; generate coverage reports -->
<execution>
<id>report</id>
<phase>test</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
作者的Junit配置如下:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
生成覆盖率报告
现在已经设置了 Jacoco,可以使用以下 Maven 命令来运行测试并生成覆盖率报告(运行流程在下面“注意点”部分):
mvn clean test
上述命令会首先清除 target/
目录(确保一切都是从新的开始),然后运行测试。在测试结束后,JaCoCo 会生成覆盖率报告。
注意点
首先,该命令是在根目录下执行的。根目录就是整个maven项目的根目录,以作者的根目录为例:
根目录点击下面的 Terminal 就能打开。然后,该命令执行时需要保证Maven项目的bin目录已经在环境变量中配好,才能执行 mvn 命令。最后结果如下:
查看报告
完成上述步骤后,我们可以在项目的 target/site/jacoco/
目录下找到一个名为 index.html
的文件。可以使用任何 web 浏览器打开这个文件来查看覆盖率报告。作者结果如下:
作者其余方法要么是没有测试类,要么就是Demo测试类没有真正调用业务方法,所以显示只有Calculate方法被完全覆盖。