首页 > 其他分享 >用 JaCoCo 生成单测覆盖率报告

用 JaCoCo 生成单测覆盖率报告

时间:2023-04-06 21:02:11浏览次数:47  
标签:插件 Plugin 覆盖率 Surefire 生成 单测 JaCoCo

我们都知道 Spock 是一个单测框架,其特点是语法简明。但当我们使用 Spock 写了一堆单元测试之后,如何生成对应的单测覆盖率报告呢?一般来说,我们会使用两个插件来一起完成单测覆盖率报告的生成,分别是:

  • Maven Surefire Plugin
  • JaCoCo Plugin

其中 Maven Surefire Plugin 是用来在 Maven 的编译阶段运行单测代码,而 JaCoCo 则是用来生成具体的单测覆盖率报告。本文将新建一个非 Web 项目来演示如何生成 Spock 的单测覆盖率报告。

初始化项目

这里初始化项目一个普通的 Java 项目,并引入对应的 Spock 依赖,如下代码所示:

<!-- spock 依赖-->
<dependency>
    <groupId>org.spockframework</groupId>
    <artifactId>spock-core</artifactId>
    <version>2.0-M2-groovy-3.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.6.2</version>
    <scope>test</scope>
</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 插件配置,如下代码所示:

<!-- surefire plugin with spock and junit -->
<plugin>
    <groupId>org.codehaus.gmavenplus</groupId>
    <artifactId>gmavenplus-plugin</artifactId>
    <version>1.9.0</version>
    <executions>
        <execution>
            <goals>
                <goal>compileTests</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0-M7</version>
    <configuration>
        <!-- 配置单测失败几次后停止执行 -->
        <skipAfterFailureCount>0</skipAfterFailureCount>
        <!-- 不允许跳过单测 -->
        <skipTests>false</skipTests>
    </configuration>
</plugin>

接着引入 JaCoCo Plugin 的配置,如下代码所示:

<!-- JaCoCo plugin -->
<plugin>
    <groupId>org.jacoco</groupId>
    <artifactId>jacoco-maven-plugin</artifactId>
    <version>0.8.7</version>
    <configuration>
        <includes>
            <include>tech/**/*</include>
        </includes>
    </configuration>
    <executions>
        <execution>
            <id>pre-test</id>
            <goals>
                <goal>prepare-agent</goal>
            </goals>
        </execution>
        <execution>
            <id>post-test</id>
            <phase>test</phase>
            <goals>
                <goal>report</goal>
            </goals>
        </execution>
    </executions>
</plugin>

生成报告

做好上述报告后,直接执行 mvn test 就可以生成单测覆盖率报告了。如果没有什么异常的话,程序会生成单测覆盖率报告文件,地址为: target/site/jacoco/index.html

我们使用浏览器打开该文件可以浏览到单测覆盖率情况,如下图所示:

单测覆盖率报告

疑问

关于如何配置这两个插件的资料很多,但都运行不起来。后面我参考了官网的配置,就成功配置好了。

但对于这两个插件,我还是有一定疑问的,例如:

  • 这两个插件到底都是啥作用?
  • 是否一定要搭配一起使用?

通过 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 就生成不了报告了。

标签:插件,Plugin,覆盖率,Surefire,生成,单测,JaCoCo
From: https://www.cnblogs.com/lizheok/p/17294133.html

相关文章

  • 超详细!手把手教你用 JaCoCo 生成单测覆盖率报告!
    我们都知道Spock是一个单测框架,其特点是语法简明。但当我们使用Spock写了一堆单元测试之后,如何生成对应的单测覆盖率报告呢?一般来说,我们会使用两个插件来一起完成单测覆盖率报告的生成,分别是:MavenSurefirePluginJaCoCoPlugin其中MavenSurefirePlugin是用来在Mave......
  • pytest生成简单测试报告命令,不用安装插件
    --junit-xml=./repot/result.xml生成JunitXML文件可在命令终端输入:pytest./case/test_DS_004.py--junit-xml=./repot/result.xml    --pastebin=all生成在线测试报告可在命令终端输入:pytest./case/test_DS_004.py--pastebin=all ......
  • 自动化测试覆盖率要到多少才算足够
    自动化测试覆盖率要到多少才算足够本文非原创,翻译自https://qahiccupps.blogspot.com/2021/09/693-ok.html“我们的测试用例中有多少是自动化的?”这个问题有很多内容,特别是当它是监控测试状态的指标的时候。这也不是我第一次被问到。根据我的经验,当有人提出这个问题时,可能是因......
  • Jacoco
    原理对Java字节码进行插桩,在线和离线两种方式。执行测试用例,收集程序执行轨迹信息,将其dump到内存。数据处理器结合程序执行轨迹信息和代码结构信息分析生成代......
  • 排序电路的testbench和覆盖率应用
    被测电路功能:(1)输入3个数据,按照由小到大的顺序排列输出。            (2)低电平系统复位;输出与时钟同步。代码如下:查看代码modulesort3(clk,xr......
  • nchan 集成keydb简单测试&一些说明
    因为keydb是完整兼容redis的,所以对于单机版本的兼容是很简单的,配置就行了参考单机运行docker-compose文件version:'3'services:db3:imag......
  • golang代码覆盖率测试
    1.概述测试是开发过程的重要部分,也是软件开发生命周期的关键部分。它可以确保应用程序正常运行和满足客户需求。本文将涵盖关于Go测试的所有须知事项。我们将从一个......
  • 业务变化快,有必要写单测吗?
    在前面一篇文章(单测无用论,这是真的吗?)中,我提到判断单测是否适用的几个维度,其中有一个就是业务变化情况。理论上来说,业务变化快,改单测成本高,维护成本也高。按理说,如果不是对......
  • maven 多模块项目的测试覆盖率分析 - jacoco 聚合分析
    前言对于大多数maven多模块化工程,可以使用Jacoco这款工具,关于Jacoco这款工具,ChatGPT对它的描述是这样的:JaCoCo(JavaCodeCoverage)是一个开源的测试覆盖率工具,它......
  • 大家都说单测没啥用,这是真的吗?
    大家好,我是树哥!工作了快10年了,跟研发小伙伴聊起单测,绝大多数人的反应是——单测没啥用,写单测就是为了应付单测覆盖率的KPI指标。恰好我最近在团队落地单测相关的内......