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

科技资讯 投稿 7700 0 评论

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

    Maven Surefire Plugin
  • JaCoCo Plugin

其中 Maven Surefire Plugin 是用来在 Maven 的编译阶段运行单测代码,而 JaCoCo 则是用来生成具体的单测覆盖率报告。本文将新建一个非 Web 项目来演示如何生成 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 Plugin 官网文档:Maven Surefire Plugin – Introduction
  • JaCoCo Plugin 官网文档:JaCoCo - Maven Plug-in

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

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

txt 和 xml 格式的报告,存放地址为 ${basedir}/target/surefire-reports/TEST-*.xml

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

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

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

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

参考资料

    JaCoCo 单元测试覆盖率 - 简书
  • 思考维度 - 浅谈代码覆盖率 - 来自有赞
  • Maven Surefire Plugin – Introduction
  • VIP!关于 Surefire 的一些配置不错!学习Maven之Maven Surefire Plugin(JUnit篇「建议收藏」 - 腾讯云开发者社区-腾讯云
  • maven单测生成覆盖率报告---Jacoco的使用 - Boblim - 博客园
  • 官网文档 JaCoCo - Maven Plug-in
  • 官网文档 Maven Surefire Plugin – Introduction

编程笔记 » 超详细,手把手教你用 JaCoCo 生成单测覆盖率报告

赞同 (35) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽