- Maven Surefire Plugin
- JaCoCo Plugin
其中 Maven Surefire Plugin 是用来在 Maven 的编译阶段运行单测代码,而 JaCoCo 则是用来生成具体的单测覆盖率报告。本文将新建一个非 Web 项目来演示如何生成 Spock 的单测覆盖率报告。
初始化项目
这里初始化项目一个普通的 Java 项目,并引入对应的 Spock 依赖,如下代码所示:
<dependency>
<groupId>org.spockframeworkgroupId>
<artifactId>spock-coreartifactId>
<version>2.0-M2-groovy-3.0version>
<scope>testscope>
dependency>
<dependency>
<groupId>org.junit.jupitergroupId>
<artifactId>junit-jupiter-engineartifactId>
<version>5.6.2version>
<scope>testscope>
dependency>
接着写一个计算器类,用于演示单测覆盖率,如下代码所示:
package tech.shuyi;
public class AdvancedCalculator {
Integer add(int a, int b) {
return a + b;
}
Integer subtract(int a, int b) {
return a - b;
}
Integer multi(int a, int b) {
return a * b;
}
Integer divide(int a, int b) {
return a / b;
}
}
接着在 test.groovy.tech.shuyi 目录写一个 Groovy 单测,如下代码所示:
package tech.shuyi
import spock.lang.Specification
class AdvancedCalculatorTest extends Specification {
def calendar = new AdvancedCalculator()
def "Add"() {
expect: calendar.add(1, 2) == 3
}
def "Substract"() {
expect: calendar.subtract(2, 1) == 1
}
def "Multi"() {
expect: calendar.multi(2, 3) == 6
}
def "Divide"() {
expect: calendar.divide(16, 4) == 4
}
}
接着我们尝试运行一下单测文件,如无异常应该是成功的。
引入插件
在这里,我们要引入对应的两个插件,并做一些简单地配置。
首先,在 pom.xml 文件引入 Surefire 插件配置,如下代码所示:
<plugin>
<groupId>org.codehaus.gmavenplusgroupId>
<artifactId>gmavenplus-pluginartifactId>
<version>1.9.0version>
<executions>
<execution>
<goals>
<goal>compileTestsgoal>
goals>
execution>
executions>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-surefire-pluginartifactId>
<version>3.0.0-M7version>
<configuration>
<skipAfterFailureCount>0skipAfterFailureCount>
<skipTests>falseskipTests>
configuration>
plugin>
接着引入 JaCoCo Plugin 的配置,如下代码所示:
<plugin>
<groupId>org.jacocogroupId>
<artifactId>jacoco-maven-pluginartifactId>
<version>0.8.7version>
<configuration>
<includes>
<include>tech*include>
includes>
configuration>
<executions>
<execution>
<id>pre-testid>
<goals>
<goal>prepare-agentgoal>
goals>
execution>
<execution>
<id>post-testid>
<phase>testphase>
<goals>
<goal>reportgoal>
goals>
execution>
executions>
plugin>
生成报告
做好上述报告后,直接执行 mvn test 就可以生成单测覆盖率报告了。如果没有什么异常的话,程序会生成单测覆盖率报告文件,地址为:target/site/jacoco/index.html。
我们使用浏览器打开该文件可以浏览到单测覆盖率情况,如下图所示:
单测覆盖率报告
疑问
关于如何配置这两个插件的资料很多,但都运行不起来。后面我参考了官网的配置,就成功配置好了。
- Surefire Plugin 官网文档:Maven Surefire Plugin – Introduction
- JaCoCo Plugin 官网文档:JaCoCo - Maven Plug-in
但对于这两个插件,我还是有一定疑问的,例如:
- 这两个插件到底都是啥作用?
- 是否一定要搭配一起使用?
通过 Surefire 插件官网,我们可以大概知道其作用为:在编译的 test 阶段,用于执行程序的单元测试,最终生成 txt 和 xml 格式的报告,存放地址为 ${basedir}/target/surefire-reports/TEST-*.xml。
由此可见,Surefire 的主要作用还是用于执行程序的单测程序,而不是生成报告。当然,官网文档也说了,你可以使用 Maven Surefire Report Plugin 来生成 HTML 格式的报告。我根据这个文档(Maven Surefire Report Plugin – Usage)配置了一下 surefire-report 插件,成功地生成 HTML 格式的报告,如下图所示。
surefire-report 插件生成的 HTML 报告
可以看到 surefire-report 插件生成的 HTML 报告还是比较简陋的,跟 JaCoCo 插件生成的相比,显然后者更加可视化一些。
看到这里,我相信大家应该能弄明白前面两个问题了:
- 这两个插件到底都是啥作用?
- 是否一定要搭配一起使用?
简单地说,Surefire 插件主要是运行单测,生成单测数据。对于 JaCoCo 插件而言,其作用是基于 Surefire 插件去生成可视化的报告。JaCoCo 插件需要基于 Surefire 插件使用,如果去掉 Surefire 插件,JaCoCo 就生成不了报告了。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341