Powermock and sonar jacoco的覆盖率不兼容问题解决 1

Powermock and sonar jacoco的覆盖率不兼容问题解决 3 Powermock and sonar jacoco的覆盖率不兼容问题解决 3 -- 使用powermock的agent来解决覆盖率不兼容问题。 阅读详情

我们的系统一直使用Powermock做unit test的mock实现,之前就发现了Powermock在sonar的jacoco的测试覆盖率非常的低,所以我们一直使用cobertura作为我们的sonar测试覆盖率工具,在maven pom文件中使用cobertura的配置如下:

<properties>
....
<!-- define the plugin in sonar, not require after sonar 4.5 -->
<sonar.java.coveragePlugin>cobertura</sonar.java.coveragePlugin>
<!-- report path -->
<sonar.cobertura.reportPath>target/site/cobertura/cobertura.xml</sonar.cobertura.reportPath>
</properties>
<!-- plugin -->
  <plugin> 
                <groupId>org.codehaus.mojo</groupId> 
                <artifactId>cobertura-maven-plugin</artifactId> 
                <version>2.6</version> 
                <configuration> 
                    <formats> 
                    <!-- generate xml report -->
                        <format>xml</format> 
                    </formats> 
                    <instrumentation>
                       <!-- ignore generated code -->
                        <ignore>com.cloud.generated.*</ignore>
                    </instrumentation>
                </configuration> 
                <executions> 
                    <execution> 
                        <id>generate-report</id>
                        <phase>prepare-package</phase>
                        <goals> 
                            <goal>cobertura</goal>  
                        </goals> 
                    </execution> 
                </executions> 
            </plugin> 

这样在package phase就可以在sit/cobertura下看到cobertura的report,执行mvn sonar:sonar就可以扫描cobertura的结果做为test覆盖率。
Note1: sonar server必须安装了支持cobertura结果分析的plugin。
Note2:cobertura会额外多run一次test,在测试用例耗时不长的时候是件好事情,在测试失败的时候可以方便排查是否是cobertura instrument对测试产生了影响。

这一次公司系统环境迁移到新的sonar环境,就不再支持cobertura的配置,所以我们被迫需要转到jacoco测试覆盖率,可是Powermock和jacoco动态测试覆盖率实在不堪入目。我们在网上调查,发现有2种解决方案:
1. 静态Jacoco, offline instrument
2. Powermock Agent

这里先说第一种offline instrument,完整例子可以参考:http://www.eclemma.org/jacoco/trunk/doc/examples/build/pom-offline.xml
这里说说我用到的实现:

<properties>
....
<jacoco.version>0.7.8-SNAPSHOT</jacoco.version>
<!-- define ut/it report path, the same in our system due to sonar version is too old and doesn't support seperated it report-->
<sonar.jacoco.reportPath>${project.build.directory}/jacoco.exec</sonar.jacoco.reportPath>
<sonar.jacoco.itReportPath>${project.build.directory}/jacoco.exec</sonar.jacoco.itReportPath>
<!-- jacoco agent path for dymanic/static instrument-->
<sonar.jacoco.jar>${settings.localRepository}/org/jacoco/org.jacoco.agent/${jacoco.version}/org.jacoco.agent-${jacoco.version}-runtime.jar</sonar.jacoco.jar>
<!-- parameter used to control the instrument process, instrument for offline should only be used for ci phase not for loadbuild and package release -->
<jacoco.skip.instrument>true</jacoco.skip.instrument>
</properties>
<!-- include jacoco agent for instrument -->
<dependency>
<!--  must be on the classpath  -->
<groupId>org.jacoco</groupId>
<artifactId>org.jacoco.agent</artifactId>
<classifier>runtime</classifier>
<version>${jacoco.version}</version>
<scope>test</scope>
</dependency>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco.version}</version>
<configuration>
  <excludes>
      <exclude>com.cloud.generated.*</exclude>
  </excludes>
  <skip>${jacoco.skip.instrument}</skip>
</configuration>
<executions>
<execution>
<id>default-instrument</id>
<goals>
<goal>instrument</goal>
</goals>
</execution>
<execution>
<id>default-restore-instrumented-classes</id>
<goals>
<goal>restore-instrumented-classes</goal>
</goals>
</execution>
<execution>
<id>default-report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.13</version>
<configuration>
<argLine>-XX:-UseSplitVerifier -javaagent:${sonar.jacoco.jar}=destfile=${sonar.jacoco.reportPath,includes=com.cloud.codes}</argLine>
<excludes>
  <exclude>**/*IntegerationTest.java</exclude>
</configuration>
</plugin>
</plugins>

这种实现的问题主要在于支持不够,offline instrument在我们的系统测试过程中对powermockito和openjpa的支持很差,只好放弃选择方案2。方案二的实现在下一次的blog中细说。

Powermock and sonar jacoco的覆盖率不兼容问题解决 2 Powermock and sonar jacoco的覆盖率不兼容问题解决2:surefire和failsafe与jacoco plugin结合使用。 阅读详情

相关推荐

单元测试之关于JaCoCo和PowerMock冲突导致类覆盖率为0的问题

在使用Mockito和PowerMock写单测的时候发现,如果使用了PowerMock的@PrepareForTest注解,JaCoCo在统计代码覆盖率的时候就会忽略注解@PrepareForTest({})里面的类,导致覆盖率统计不准确 对于一些工具类,我们可以先使用@PrepareForTest完成单测的开发,再单独对工具类写单测就行了,只要@PrepareForTest里面的类不是自己的项目代码就可以了(比方说第三方jar包提供的), 但是在遇到系统类的时候就不行了。因为PowerMock 在mock

qq_35448165的博客 1万+

解决Jacoco和PowerMock不兼容的问题

在使用PowerMock来写单元测试的时候,且单元测试里面下面的@PrepareForTest和@RunWith(PowerMockRunner.class)的时候,单元测试能成功跑出来,但是其生成的单元测试覆盖率为零。那如何解决呢?

超越梦想,一起飞!!! 6104

JaCoCo统计PowerMock的覆盖率为零的解决办法

最近在写单元测试,用到了PowerMock,测试覆盖率的时候碰到一个奇怪的问题,有几个类用idea的JaCoCo插件测试覆盖率为0,但用idea自己的插件测没问题,网上找了下,原来是JaCoCo和PowerMock冲突了,JaCoCo会忽略注解@PrepareForTest({})里面的类,解决办法是用JaCoCo的离线模式。 产生问题的代码如下 @RunWith(P...

yangbo10086的博客 2万+

单元测试测试用例覆盖率为0

做一下记录,做测试覆盖的时候,总是显示覆盖率为0,于是在pom文件中添加 plugin>           groupId>org.codehaus.mojogroupId>           artifactId>cobertura-maven-pluginartifactId>           version>2.7version>  plugin>   解決了

孤独的牧羊人的专栏 6476

ERA5数据驱动WRFV4.4实战:单层嵌套配置与关键报错排查指南

本文详细介绍了使用ERA5再分析数据驱动WRFV4.4模式进行单层嵌套模拟的完整实战流程。内容涵盖从数据精准下载、WPS前处理配置、WRF核心参数设置到高频报错的深度排查与解决方案,旨在帮助初学者在有限服务器资源下,高效完成WRF模拟并规避常见陷阱。

q5r6s7的博客 770

ACM论文LaTeX模板解析(三)| 文章顶部信息(Top matter))Part 1

文章顶部信息(Top matter))Part 1,文章类型、作者信息等

FreshManInC的博客 4853

对于用Powermock编写的测试用例,sonar中单元测试覆盖率统计不正确的问题

用PowerMock写的单元测试用例,sonar中覆盖率显示问题 sonar中没有覆盖率的显示问题 sonar中覆盖率显示不正确 sonar中单元测试用例个数不正确问题 sonar中没有覆盖率的显示问题 pom文件中jacoco-maven-plugin配置不正确,做了如下配置,sonar中有了覆盖率的显示 <plugin> <groupId>org.jacoco</

qq_23589557的博客 9437

基于Hadoop的NBA篮球球员大数据分析与可视化系统大数据分析系统python的项目(源码+lw+部署文档+讲解等)

本系统以 Hadoop 为基础,致力于对 NBA 篮球球员的海量数据进行深入分析与可视化呈现。它能够收集来自多个数据源的丰富数据,包括球员比赛统计数据、身体素质数据、技术特点数据等。利用 Hadoop 的分布式存储和计算能力,对这些大规模数据进行高效处理。通过数据分析算法,挖掘球员的潜在价值和特点,如球员的得分能力趋势、篮板球效率变化、不同位置球员的技术差异等。同时,借助先进的可视化技术,将分析结果以直观的图表、图形等形式展示出来。教练和球队管理层可以通过可视化界面清晰地了解球员的综合表现和发展态势,从而制

QQ3359892174的博客 1314

Apache DolphinScheduler 项目笔记 — 1. 问题定位和排查问题

导语:Yuanhao Ji 同学是《暑期 2021 - API 模块 UT 测试问题解决》项目负责人,本文记录了他是如何排查和定位问题。1. 背景问题:在部分 UT 中使用 PowerMo...

Apache DolphinScheduler开源社区 460

半导体测试(一)

探针台是一种用于在晶圆上进行配合探针卡进行电路量测的设备,在测试过程中,探针工作站会将探针与晶圆上的每个die进行接触,以进行电性测量。在这个过程中,每个die都被测试以确保它能基本满足器件的特征或设计规格书(Specification),通常包括电压、电流、时序和功能的验证。晶圆是一个圆形的硅片,在这个半导体的基础之上,建立了许多独立的单个的电路;在所有的die都被探测(Probed)之后,晶圆被切割成独立的dice,这就是常说的die saw,所有被标示为失效的die都被报废,。

m0_37606066的博客 8424

Python实战:5分钟搞定N-CMAPSS航空发动机数据集解析(附完整代码)

本文提供了一份针对N-CMAPSS航空发动机数据集的快速解析实战指南。通过Python的h5py库,详细演示了如何读取HDF5文件结构、理解数据分类(如传感器、健康参数、场景描述符)并加载为Pandas DataFrame。文章还澄清了数据集中常见的变量数量疑惑,并给出了从数据加载到构建剩余使用寿命预测模型预处理流水线的完整代码,帮助工程师和研究人员高效入门航空发动机预测性维护分析。

weixin_29057065的博客 422

sonar的offline模式

sonar的模式扫描是使用jacoco插件进行扫描的, 默认的扫描也是on-line模式的, online模式我们线上是一直使用这个, 但是以前也是发现了一个问题, 就是sonar的on...

故事凌 841

sdio wifi 移植

介绍 简单来说,sdio起源自sd标准,顾名思义就是sd的IO接口(interface)的意思,更具体的说明,sd本来是记忆卡的标准,但是现在也可以把SD卡拿来插上一些外围设备接口使用,这个就是就叫做sdio。 而且sdio本身是一种相当单纯的技术,通过sd的IO引脚来连接外部外围,并且通过sd的IO数据接位与外围传输数据,而且sd协会也推出很完整的sdio stack 驱动程序,使得sdio外围得开发与应用变得非常热门 这里我们要移植的是RTL8822cs的sdio WiFi 模块,将其移植到rk3

Enosji的博客 9609

Android 单元测试实战(3)—— 基于Cobertra&sonarqube的单元测试覆盖率统计

Jacoco 在聊到单元测试覆盖率的时候,基本上都会使用jacoco做覆盖率检测,但通过集成发现与Powermock有兼容性问题。 对于Powermock上使用@PrepareForTest的类,都无法检测覆盖率。导致覆盖率几乎为0。 Powermock的开发者也表明是由于底层实现逻辑上,与jacoco冲突导致的。计划未来去解决该问题。 jacoco提供了一种静态的代码覆盖率检测,但搞了很久,使用...

茅屋 1265

【AI测试干货】软件测试 - 全流程提示词完整体系

本篇教程是一套专为软件测试工程师打造的 AI 协作提示词体系。从测试计划制定、用例设计、自动化脚本开发、缺陷管理,到测试报告生成,每个环节都提供了结构化的提示词模板,帮助测试人员高效利用 AI 提升工作质量。

blues_C的博客 347

【DL经典回顾】距离度量大汇总(7-余弦距离(Cosine Distance))

余弦距离(Cosine Distance)衡量的是两个向量在方向上的差异性,而不是在大小上的差异。

悦学共鸣,温柔以待,汇聚光芒,共同成长 2579

JUnit 6实战:系统化提升单元测试覆盖率至90%+的完整指南

单元测试是保障软件质量的核心实践,通过隔离被测代码并验证其行为,为系统构建可靠的安全网。其原理在于通过自动化测试用例,覆盖代码的各个执行路径,包括正常流程与异常分支。高覆盖率的测试不仅能快速发现回归缺陷,更能驱动代码设计向高内聚、低耦合演进,提升可维护性。在实践中,结合JUnit 6的现代特性(如参数化测试、动态测试)与Mockito、AssertJ等工具,可以高效构建健壮的测试套件。本文聚焦于如何利用JUnit 6和JaCoCo等工具链,系统性地将单元测试覆盖率提升至90%以上,涵盖从工具选型、测试策略到

weixin_34411563的博客 607

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java代码质量管理

主要对下面的七块进行分析编码格式规范:codeStyle和CheckStyle代码重复:PMD 的 CPD代码覆盖率:Coverlipse或者Emma依赖项分析:JDepend复杂度监控:MetricsJava模拟技术:EasyMock、PowerMock代码评审和重构:Jupiter...

moonpure的专栏 1479

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

TestableMock实战:用字节码增强终结Java单元测试Mock难题

在Java单元测试中,Mock技术是隔离外部依赖、提升测试效率的核心手段。然而传统工具如Mockito基于动态代理实现,面对静态方法、私有方法和构造函数时往往束手无策;PowerMock虽能解决但常伴随版本冲突与JDK兼容问题。字节码增强技术通过在类加载阶段改写字节码,从根本上绕过代理机制的限制,为测试 Mock 提供了更彻底的解决方案。TestableMock正是基于javaagent的字节码增强工具,它无需改造业务代码,即可轻松Mock静态方法、私有方法及new对象,并与Mockito无缝协作,覆盖业务

weixin_28837817的博客 231

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jacoco离线模式最佳实践,解决powermock覆盖率异常问题,包含排除包,类和检测覆盖率规则

问题复现 在我司对核心业务基于Spock落地单元测试过程中, 使用jacoco插件生成单元测试报告,遇到了覆盖率异常的问题. 问题原因 经过排查, 最终发现在使用powermock的 @PrepareForTest([HttpUtils.class, XXXHandler.class]) 注解时, 数组里的类是会被Jacoco忽略的. powermock和jacoco存在冲突,以下是抄来的解释: JaCoCo和PowerMock都是通过在加载类的时候修改字节码文件来实现统计覆盖率和mock静态类的功能。

abao_gege的博客 5432

java & jacoco & powerMock 单元测试覆盖率为0怎么解决

java & jacoco & powerMock 单元测试覆盖率为0怎么解决([WARNING] Classes in bundle 'MyDemoProject' do not match with execution data. For report generation the same class files must be used as at runtime. [WARNING] Execution data for class com/demo/controller/DemoControl)

object_object的专栏 1万+

记一次解决maven项目sonarqube中覆盖率一直显示为0的问题.jacoco统计显示.

用了整整三天.QAQ.靠体力一下下试出来的结果.踩了个坑. 一开始,项目的覆盖率显示的是0,单元测试数也没有显示. 首先,想到的是test中的项目包结构目录的问题. 倒不是一定是全的,需要的包的路径结构要完整. 于是调整了test中的包结构,把测试class的命名改为了(原java)Test 项目用的是testng.不知道为啥,junit的我没运行出来单元测试数. 在工程目录,右击选择run with coverage.testng的.(可以为这个容器edit configurations-&g

level_Tiller的博客 1万+

PowerMockito踩坑指南

好久没用PowerMockito了,最近使用踩了一堆的坑,记录一下1、对于测试类中包含@Autowired注解的变量可以使用@Mock注解,被测试类使用@InjectMock注解,注意此时被测试的类还是实例化后的,而不是mock出来的,如下: 2、对于局部变量的mock(new 出来的局部变量)方法一:在1的基础上,将被测试的类加入到@PrepareForTest中,这时再mock局部变量就会生效(mock一个对象,然后将局部变量的构造方法进行mock,返回mock出的对象),如下: 方法二:将被测

编程入不了 门 3138

SonarQube部署及Powermock测试用例编写

1.部署篇 1.1安装流程 在官网下载SonarQube7.4, ps:本来使用的是推荐的最新9.1版本,在启动bin目录下StartSonar.bat出现无法创建jvm的错误,个人判断为java版本与SonarQube版本不符(jdk版本为1.8.144) 新建数据库 create database sonar7 default character set utf8 collate utf8_general_ci; 数据库如果要使用Mysql,要使用5.6/5.7版本,soanr.propertie

qq_40662424的博客 717

解决sonar的单元测试的覆盖率会为0问题

今天做项目遇到一个问题,明明做单元测试时覆盖率已经百分百了,然后传到Jenkin上,构建也成功了,但偏偏覆盖率就是为零,非常确定代码没有问题,所以唯一的问题就是出现在配置上了。 一开始的结果如下: Jenkin上面的配置如下: 一开始以为是我要扫描的包原因,所以我就在这下面把全部文件的路径都加上去了,结果却没有显示覆盖率了,进去深处一开,也是为零。 后来才知道 加了这些路径的意思是sonar都不要扫描这些包,因为他和我们做的单元测试没有关系,因此这个配置是要加和单元测试无关的文件路径,..

weixin_48788601的博客 1万+

记录代码逻辑已经覆盖了但Jenkins上显示覆盖率为0

写完单元测试后放在Jenkins上build查看测试覆盖率,发现覆盖率为0

seabirdssss的博客 650
上一篇: Maven程序打包成单个Jar Part 2 -- Maven shade plugin
下一篇: Powermock and sonar jacoco的覆盖率不兼容问题解决 2
开心的D哥
博客等级 码龄22年 63粉丝 110原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值