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

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

时间:2023-06-11 10:00:34浏览次数:65  
标签:插件 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

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

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

疑问

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

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

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

通过 Surefire 插件官网,我们可以大概知道其作用为:在编译的 test 阶段,用于执行程序的单元测试,最终生成 txtxml 格式的报告,存放地址为 ${basedir}/target/surefire-reports/TEST-*.xml

由此可见,Surefire 的主要作用还是用于执行程序的单测程序,而不是生成报告。当然,官网文档也说了,你可以使用 Maven Surefire Report Plugin 来生成 HTML 格式的报告。我根据这个文档(Maven Surefire Report Plugin – Usage)配置了一下 surefire-report 插件,成功地生成 HTML 格式的报告,如下图所示。

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

可以看到 surefire-report 插件生成的 HTML 报告还是比较简陋的,跟 JaCoCo 插件生成的相比,显然后者更加可视化一些。

看到这里,我相信大家应该能弄明白前面两个问题了:

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

简单地说,Surefire 插件主要是运行单测,生成单测数据。对于 JaCoCo 插件而言,其作用是基于 Surefire 插件去生成可视化的报告。JaCoCo 插件需要基于 Surefire 插件使用,如果去掉 Surefire 插件,JaCoCo 就生成不了报告了。

参考资料

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



标签:插件,Plugin,教你用,Surefire,Maven,单测,JaCoCo
From: https://blog.51cto.com/u_13879334/6457079

相关文章

  • 订单测试点__肖sir___整理测试点
    订单测试点=============================== 一、商品订单的测试点正常场景:1.选择商品创建订单,订单状态更改为:待付款状态2.待付款订单进行支付,订单状态更改为:待发货状态3.后台选择待发货状态的订单填写快递公司、快递单号进行发货,订单状态更改为:待收货状态4.前台点击确认收......
  • 手把手教你用Python做一个图像融合demo,小白可上手!
    1.创作背景说到融合,一下子会让我们这些95后想起来童年的动漫游戏王了!发动魔法卡——融合!哈哈,今天说得当然不是游戏王里的魔法了,但是我们使用的是Python魔法,今天我们将使用Python编程语言,以及自带的图像处理工具包进行图像融合操作,来实现图像融合的酷炫效果!前几天在网上看了一个dem......
  • 针对 B/S、C/S 架构的 180 个简单测试案例——GUI 和可用性测试场景
    这是一个针对web应用和桌面应用程序的测试清单假设:假定你的应用程序支持下列功能:-带有多种字段的表单-子窗口-与数据库交互-多种查询过滤规则和结果显示-图片上传-邮件发送-数据导出GUI和可用性测试场景1.页面中的所有字段(如:文本框,单选选项,下拉列表)应该适当对齐2.除特殊指定外,数......
  • 针对 B/S、C/S 架构的 180 个简单测试案例—窗口测试用例
    -测试清单可以提供给开发人员查阅,以保证在开发阶段就避免出现一些常见的问题。几点说明:1)用不同的用户角色执行这些测试场景,如:管理用户,来宾用户等。2)对于web应用,这些场景应该在客户认可的多种浏览器的各个版本上进行测试,如:IE,Firefox,Chrome,Safari等。3)用不同的屏幕分辨率进行测试,如......
  • 针对 B/S、C/S 架构的 180 个简单测试案例——结果表测试场景
    这是一个针对web应用和桌面应用程序的测试清单。假设:假定你的应用程序支持下列功能:-带有多种字段的表单-子窗口-与数据库交互-多种查询过滤规则和结果显示-图片上传-邮件发送-数据导出结果表测试场景1.当结果页面加载时长超过默认时长时,应该显示“页面加载中”之类的提示信息2.检......
  • 针对 B/S、C/S 架构的 180 个简单测试案例——图像上传功能的测试场景(也适用于其他文
    1.检查图片上传路径2.检查图像上传和修改功能3.检查各种扩展图像文件的上传(例如JPEG、PNG、BMP等).4.检查文件名中含有空格或其他可用特殊字符的图片的上传5.检查重复名称图片上传6.图片尺寸大于最大允许值,上传时应该显示适当的错误消息.7.检查上传的图片文件类型外的其它文件......
  • SM2259XT2+IM3D固件下载,DIY+简单测试SM2259XT2+384G B0KB的固态
    SM2259XT2固件下载,DIY+简单测试SM2259XT2+384GB0KB的固态。这是本次要出场的固态U盘:刚好找到一个美光的B0KB,单颗384GB,想起来之前买了几百片59XT2的U盘板子,刚好这个东西支持,贴上去试试。从量产部落下载了SM2259XT2开卡工具,上电读一下ID,ID齐全,直接自动识别开卡。一把过,颗粒原来在一......
  • 十一、SonarQube自定义质量门禁和使用Jacoco
    一、自定义质量门阀接着上个例子,从流水线的运行结果来看,质量门禁通过了,使用的是默认的规则。但是代码的规则和单元测试的覆盖率等没有限制。因此需要自定义质量门禁规则。  这里添加了两个代码条件并设置为默认规则。如果覆盖率不到80%或单元测试有错误都不通过质量门禁。......
  • jacoco统计覆盖率
    前言:本来想快速搞定覆盖率这个的。随便搜了搜博客,想走捷径。最终发现想弄懂,还是得看官网,才能把东西弄透。(唉,读英文文档,总是会有点难度的啊。。。选中文博客,真的和玩狼人杀一样。。搜索完挨个试一试。。。另外中文博客很少有把官方文档详细翻译,或者把东西说透彻的,也许有但不好......
  • C# explicit operator 显式转换简单测试
    staticvoidMain(string[]args){TESTtEST=newTEST{Hello=100};TEST_STtEST_ST=(TEST_ST)tEST;Console.WriteLine(tEST_ST.Hello);tEST_ST=newTEST_ST(){Hello=111};TESTtEST1=(TEST)tEST_ST;Console.WriteLine(......