首页 > 其他分享 >超详细!手把手教你用 JaCoCo 生成单测覆盖率报告!

超详细!手把手教你用 JaCoCo 生成单测覆盖率报告!

时间:2023-04-06 19:55:19浏览次数:66  
标签:插件 Plugin 教你用 Surefire Maven 单测 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 阶段,用于执行程序的单元测试,最终生成 txtxml 格式的报告,存放地址为 ${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,Maven,单测,JaCoCo
From: https://www.cnblogs.com/chanshuyi/p/quick-start-of-jacoco.html

相关文章

  • 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 ......
  • Jacoco
    原理对Java字节码进行插桩,在线和离线两种方式。执行测试用例,收集程序执行轨迹信息,将其dump到内存。数据处理器结合程序执行轨迹信息和代码结构信息分析生成代......
  • nchan 集成keydb简单测试&一些说明
    因为keydb是完整兼容redis的,所以对于单机版本的兼容是很简单的,配置就行了参考单机运行docker-compose文件version:'3'services:db3:imag......
  • 业务变化快,有必要写单测吗?
    在前面一篇文章(单测无用论,这是真的吗?)中,我提到判断单测是否适用的几个维度,其中有一个就是业务变化情况。理论上来说,业务变化快,改单测成本高,维护成本也高。按理说,如果不是对......
  • 教你用Python画个可爱的皮卡丘!(附完整源码)
    版权声明:原创不易,本文禁止抄袭、转载,侵权必究! 一、去吧!皮卡丘!使用turtle(海龟库)制作而成,感觉挺好玩的,哈哈@>_<@,效果如下: 由于源码过长,这里仅展示部分代码:from......
  • 桌面文件又多又乱?教你用Python一键清理,只需20行代码轻松实现!
    我这个人比较懒,总是喜欢把收到的重要文件,或者比较紧急的文件放到桌面,久而久之,桌面或者文件夹越来越乱。不知道大家是不是像我一样的我滴妈呀,看着就很崩溃!之......
  • maven 多模块项目的测试覆盖率分析 - jacoco 聚合分析
    前言对于大多数maven多模块化工程,可以使用Jacoco这款工具,关于Jacoco这款工具,ChatGPT对它的描述是这样的:JaCoCo(JavaCodeCoverage)是一个开源的测试覆盖率工具,它......
  • 大家都说单测没啥用,这是真的吗?
    大家好,我是树哥!工作了快10年了,跟研发小伙伴聊起单测,绝大多数人的反应是——单测没啥用,写单测就是为了应付单测覆盖率的KPI指标。恰好我最近在团队落地单测相关的内......
  • 手把手教你用python写游戏
    引言最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏、后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏......
  • 软件测试|教你用Matplotlib绘制多种饼图
    前言之前我们介绍了使用matplotlib绘制柱状图等图像,这篇文章我们将介绍使用matplotlib绘制饼状图,并且我们将介绍使用matplotlib绘制不同类型的饼图,下面我们直接开始绘制。绘......