springboot多模块工程单元测试jacoco统计代码覆盖率总结

news2024/12/23 9:05:04

jacoco统计代码覆盖率的文章一搜一大堆,方法也很简单,就是在pom中引用两个插件:

maven-surefire-plugin

jacoco-maven-plugin

其中jacoco-maven-plugin的关键配置为要有两个execution:

一个goal是prepare-agent,即准备agent,实现为代码插桩

一个goal是report,顾名思义,即生成覆盖率报告

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.18.1</version>
        <configuration>
            <skipTests>false</skipTests>
            <testFailureIgnore>true</testFailureIgnore>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.8.5</version>
        <executions>
            <execution>
                <id>my-prepare-agent</id>
                <goals>
                    <goal>prepare-agent</goal>
                </goals>
            </execution>
            <execution>
                <id>my-report</id>
                <phase>test</phase>
                <goals>
                    <goal>report</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</plugins>

但是如果是多模块的工程呢?如下面的结构:

├── module1
│   └── pom.xml
├── module2
│   └── pom.xml
├── module3
│   └── pom.xml
├── pom.xml

每个模块都这么配置的话,生成的报告是各自独立的,即会生成3个报告,那么怎么把各个模块的代码覆盖率统计在一起,生成一个聚合的报告呢?

可以参考七个披萨的博客,我觉得他的这篇文章写的特别好,强烈推荐读一下:jacoco插件配置生成单元测试覆盖率报告_七个披萨的博客-CSDN博客_jacoco:report-aggregate

我在这里复述一下其给出的做法:

jacoco提供了报告聚合的能力(goal为report-aggregate,注意与上面提到的report的区别),这就需要有一个模块来做报告聚合,这个模块需要引用所有的其他模块(以上面举例的工程为例,这个模块可以是新增的module4,也可以在module1/2/3中任选一个,一般在多模块的工程中,都会有一个主模块做为启动模块,可以用这个启动模块来做jacoco的报聚合)

划一下重点:

  1. 一个模块配置jacoco的report-aggregate
  2. 这个模块需要引用所有的其他模块

具体做法如下:

第一:在项目根目录下的父pom中添加jacoco-maven-plugin,并配置goal是prepare-agent(这么做的好处是不用在每个module的pom中都重复添加同样的内容)

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.18.1</version>
        <configuration>
            <skipTests>false</skipTests>
            <testFailureIgnore>true</testFailureIgnore>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.8.5</version>
        <executions>
            <execution>
                <id>my-prepare-agent</id>
                <goals>
                    <goal>prepare-agent</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</plugins>

第二:在聚合模块中配置jacoco聚合报告:

<plugins>
    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.8.5</version>
        <executions>
            <execution>
                <id>my-report</id>
                <phase>test</phase>
                <goals>
                    <goal>report-aggregate</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</plugins>

第三:在聚合模块中引用其他模块(非常重要,只有引用的模块的覆盖率才会被聚合到报告中,未引用的模块的覆盖率不会被收集和聚合):

  <dependencies>
    <dependency>
      <groupId>@project.groupId@</groupId>
      <artifactId>module1</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>@project.groupId@</groupId>
      <artifactId>module2</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>@project.groupId@</groupId>
      <artifactId>module3</artifactId>
      <version>${project.version}</version>
    </dependency>
 </dependencies>

但是我按照上述文章提到的方法配置后,可以得到聚合的报告了,但是覆盖率都为0,这又是怎么回事呢?

搜索了很多文章都无解,最后查看jacoco的help才找到答案:

需要在maven-surefire-plugin中配置引用jacoco的输出属性argLine

jacoco在prepare-agent阶段会生成一个属性指向jacoco的runtime agent,默认这个属性叫argLine,我们需要在maven-surefire-plugin的配置中,引用这个属性(当然我们也可以自定义这个属性的名字,那么就需要在maven-surefire-plugin的配置中引用我们自定义的属性名)

        <configuration>
          <argLine>${argLine}</argLine>
        </configuration>

最终在根目录的pom.xml是这样的

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.18.1</version>
        <configuration>
            <skipTests>false</skipTests>
            <testFailureIgnore>true</testFailureIgnore>
            <argLine>${argLine}</argLine>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.8.5</version>
        <executions>
            <execution>
                <id>my-prepare-agent</id>
                <goals>
                    <goal>prepare-agent</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</plugins>

或者在prepare-agent阶段自定义输出的属性名:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.18.1</version>
        <configuration>
            <skipTests>false</skipTests>
            <testFailureIgnore>true</testFailureIgnore>
            <argLine>${jacocoArgLine}</argLine>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.jacoco</groupId>
        <artifactId>jacoco-maven-plugin</artifactId>
        <version>0.8.5</version>
        <executions>
            <execution>
                <id>my-prepare-agent</id>
                <goals>
                    <goal>prepare-agent</goal>
                </goals>
                <configuration>
                  <propertyName>jacocoArgLine</propertyName>
                </configuration>
            </execution>
        </executions>
    </plugin>
</plugins>

好了,这时再去运行一下:

mvn test -Dmaven.test.failure.ignore=true

看看聚合报告的结果吧。

jacoco帮助命令行提示原文如下,有兴趣的英文好的同学可以看看

jacoco:prepare-agent
  Prepares a property pointing to the JaCoCo runtime agent that can be passed as
  a VM argument to the application under test. Depending on the project
  packaging type by default a property with the following name is set:
  
  - tycho.testArgLine for packaging type eclipse-test-plugin and
  - argLine otherwise.
  
  If your project already defines VM arguments for test execution, be sure that
  they will include property defined by JaCoCo.
  
  One of the ways to do this in case of maven-surefire-plugin - is to use syntax
  for late property evaluation:
  
   <plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <configuration>
   <argLine>@{argLine} -your -extra -arguments</argLine>
   </configuration>
   </plugin>
  
  You can define empty property to avoid JVM startup error Could not find or
  load main class @{argLine} when using late property evaluation and
  jacoco-maven-plugin not executed.
  
  Another way is to define 'argLine' as a Maven property rather than as part of
  the configuration of maven-surefire-plugin:
  
   <properties>
   <argLine>-your -extra -arguments</argLine>
   </properties>
   ...
   <plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <configuration>
   <!-- no argLine here -->
   </configuration>
   </plugin>
  
  Resulting coverage information is collected during execution and by default
  written to a file when the process terminates.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141072.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaEE】初识Spring

目录 一、创建Spring项目 二、介绍理论 一、创建Spring项目 通过maven创建Spring项目&#xff0c;我们需要借助一些工具完成工程的创建。 1.pom.xml 2.一部分示例代码 Spring提供了一个Spring Initializr使用网页版本。 然后将得到文件的内容用idea打开。然后执行会显示未连…

集群环境下解决定时任务重复执行的问题【案例分享】

【辰兮要努力】&#xff1a;hello你好我是辰兮&#xff0c;很高兴你能来阅读&#xff0c;昵称是希望自己能不断精进&#xff0c;向着优秀程序员前行&#xff01; 博客来源于项目以及编程中遇到的问题总结&#xff0c;偶尔会有读书分享&#xff0c;我会陆续更新Java前端、后台、…

机器学习中的数学原理——似然函数

这个专栏主要是用来分享一下我在 机器学习中的 学习笔记及一些 感悟&#xff0c;也希望对你的学习有帮助哦&#xff01;感兴趣的小伙伴欢迎 私信或者 评论区留言&#xff01;这一篇就更新一下《 白话机器学习中的数学——似然函数》&#xff01;什么是似然函数似然函数 定义. 在…

电商让客户等待的话术

在电商平台购物时&#xff0c;在购物前后客户难免会产生一些问题&#xff0c;客服需要先进行核对&#xff0c;或者需要转接给专员进行接待&#xff0c;在这期间&#xff0c;客户需要等候&#xff0c;这时候需要给客户发送一些等候话术。前言在电商平台购物时&#xff0c;在购物…

uni-app动态修改manifest.json中的参数

以根据不同环境配置不同的h5运行路径为例&#xff0c;动态修改h5.router.base 假设当前有三种环境 process.env.NODE_ENV developmentprocess.env.NODE_ENV testprocess.env.NODE_ENV production 在src根目录下创建modifyManifest.js文件&#xff08;一定是src&#xff09;…

渗透测试工程师的职业发展

前段时间看了一个大哥写的程序员的职业发展&#xff0c;感触很深&#xff0c;这几天晚上就参考大哥的思路结合自身的经历写一下渗透工程师的职业发展之路&#xff0c;顺便也让迷茫中的小伙伴们有个参考。 很多干渗透、安全服务、安全运维的人在干了3-5年后面对迷茫期&#xff…

2022年度猫狗粮销售数据:十大热门品牌排行榜,哪些品牌入围?

当前&#xff0c;“吸猫撸狗”正成为当代年轻人新的生活方式&#xff0c;越来越多的人乐意为了自己的“毛孩子”买单&#xff0c;这使得宠物经济快速发展。伴随着宠物食品概念越来越被消费者所接受&#xff0c;目前&#xff0c;我国宠物食品行业呈现爆发式增长&#xff0c;宠物…

电脑只有一个c盘怎么办?看我怎么一招解决!

很多朋友在网上新买了笔记本电脑&#xff0c;打开电脑后发现它只有一个磁盘&#xff0c;电脑只有一个c盘怎么办&#xff1f;下面以Windows 10系统为例进行步骤说明&#xff0c;让我们一起来解决电脑只有一个磁盘的难题吧&#xff01; 操作环境&#xff1a; 演示机型&#xff1a…

再谈什么是【组织能力】

&#xff08;1&#xff09;我过去讲过两个公式&#xff1a;从这两个公式都能看出来&#xff0c;企业管理和业务管理的巨大区别。我过去也专门讲过企业管理&#xff1a;愿景使命-文化价值观、战略目标-战略路径企业治理-企业组织、商业模式创新-品牌影响力-持续客户关系经营健康…

YoloV5+DAMOYOLO:将DAMOYOLO中的GFPN结构与Yolov5结合

前段时间写了一篇damoYolo的训练教程&#xff0c;同时也对自己的数据集进行了训练&#xff0c;虽然效果确实不是很好&#xff0c;但是damoyolo的一些思想和网络结构啥的还是可以借鉴使用的&#xff0c;此次将damoyolo的RepGFPN结构掏出来放到v5的NECK中&#xff0c;测试一下对本…

进程间通信——管道通信

目录 1 管道概念 2 无名管道&#xff08;pipe&#xff09;只能给有亲缘关系进程通信 步骤 注意事项 3 有名管道&#xff08;fifo&#xff09; 可以给任意单机进程通信 步骤 注意事项 1 管道概念 管道是UNIX 系统IPC 的最古老形式&#xff0c; 并且所有UNIX 系统都提供此种…

JavaWeb项目 -- 博客系统

JavaWeb项目 -- 博客系统前言&#xff1a;页面展示一、创建 Maven 项目二、设计数据库三、封装数据库的操作3.1 创建 DBUtil 类3.2 创建 Blog 类3.3 创建 User 类3.4 创建类 BlogDao3.5 创建类 UserDao四、导入准备好的前端代码五、实现博客列表界面5.1 约定好前后端交互接口5.…

excel函数应用:如何用数位函数分段提取身份证信息 上篇

用Excel处理身份证号&#xff0c;在我们日常工作中是相当普遍的&#xff0c;尤其是对于做人事行政工作、财务工作的同学来说&#xff0c;更显得十分重要。那么一个身份证号&#xff0c;能给予我们多少信息量呢&#xff1f;无论我们需要用Excel处理何种数据&#xff0c;首先都应…

python 使用矢量化替换循环

介绍 &#x1f3b5;&#x1f57a;&#x1f5e3;&#x1f3c0; 循环自然而然地出现在我们身边&#xff0c;我们了解几乎所有编程语言中的循环。因此&#xff0c;默认情况下&#xff0c;只要有重复操作&#xff0c;我们就会开始执行循环。但是当我们处理大量迭代&#xff08;数百…

5G NR标准 第14章 调度

第14章 调度 NR 本质上是一个调度系统&#xff0c;这意味着调度器决定何时以及向哪些设备分配时间、频率和空间资源&#xff0c;以及使用什么传输参数&#xff0c;包括数据速率。 调度可以是动态的或半静态的。 动态调度是基本的操作模式&#xff0c;其中调度程序针对每个时间…

【JVM 从入门到精通系列】 JVM 字节码指令篇 之 Class文件结构

一、概述 字节码文件的跨平台性 Java语言&#xff1a;跨平台的语言 当Java源代码成功编译成字节码后&#xff0c;如果想在不同平台上运行&#xff0c;则无需再次编译。这个优势已经不再那么吸引人了&#xff0c;Python、PHP、Perl、Ruby、Lisp等有强大的编译器。跨平台似乎已…

uniprot蛋白序列数据库,蛋白质结构数据库PDB;pymol pse格式

https://www.bilibili.com/video/BV1p34y1D77Z https://www.bilibili.com/video/BV1Xa4y1W7Dx 蛋白质结构数据库PDB 注意点&#xff1a;很多数据含有共晶配体的结构 很多时候&#xff0c;蛋白晶体结构中不只是蛋白&#xff0c;还可能有核酸、多肽、辅酶、小分子化合物&#…

振动力学——2.单自由度系统无阻尼自由振动能量法

对于不计阻尼即认为没有能量损失的单自由度系统&#xff0c;可利用能量守恒原理建立自由振动微分方程&#xff0c;或直接求出固有频率无阻尼系统为保守系统&#xff0c;其机械能守恒&#xff0c;即动能T和势V之和保持不变 &#xff0c;即&#xff1a; 或 (1-9) 图1-7弹簧质量…

Clickhouse 三节点三分片六实例双副本部署,用户密码权限配置,cpu内存资源优化

文章目录1. rpm安装ck2. 集群规划3. config.xml文件配置&#xff08;1&#xff09;分片副本信息配置&#xff08;2&#xff09;zookeeper信息配置&#xff08;3&#xff09;macros 信息配置&#xff08;4&#xff09;注释掉映射信息&#xff08;5&#xff09;修改实例中的日志路…

深入理解MySQL——master thread分析

1. master thread的线程分析 master thread的线程优先级别最高。其内部由几个循环&#xff08;loop&#xff09;组成&#xff1a;主循环&#xff08;loop&#xff09;、后台循环&#xff08;background loop&#xff09;、刷新循环&#xff08;flush loop&#xff09;、暂停循…