当前位置: 首页 > 知识库问答 >
问题:

JaCoCo插件给出了不同的覆盖范围

欧阳意蕴
2023-03-14

我使用JaCoCo Maven插件和代理来测量和检索每晚测试的应用程序的代码覆盖率数据。这是该架构的模式:

我的Maven项目配置了JMeter Maven插件,在Maven验证阶段执行一些API测试,Jenkins服务器执行的Maven命令如下

mvn verify org.jacoco:jacoco-maven-plugin:0.7.8:dump sonar:sonar -Djacoco.address=TEST_SERVER -Djacoco.destFile=/proj/coverage-reports/jacoco-it.exec -Dsonar.projectKey=sonar_test -Dsonar.projectName=sonar_test -Dsonar.branch=sonar_test -Dsonar.jacoco.itReportPath=/proj/coverage-reports/jacoco-it.exec -Dsonar.java.coveragePlugin=jacoco -Dsonar.language=java

正如您首先看到的,测试是通过验证阶段执行的,然后jaco:dump目标从测试服务器检索覆盖范围数据(我已将服务器配置为运行JaCo代理),最后将数据上传到我的Sonar服务器。

我的“奇怪”行为是,如果我在我的计算机上运行这个命令,然后在SonarQube页面中的Jenkins(相应地配置Jenkin项目)上运行,我会得到不同的覆盖率结果。此外,如果我配置了Jenkins项目,然后简单地复制它,创建一个新的(但等效的)Jenkin项目,结果会有所不同。

我尝试了不同的配置和案例,但我无法理解问题可能是什么。我是否没有考虑一些JaCoCo约束(例如,与Jenkins项目名称相关的一些约束)?

共有1个答案

汤修贤
2023-03-14

正如问题注释中所说,部署在测试服务器上的工件和在生成报告的verify阶段编译的工件必须完全相同,因此代码相同是不够的。

为了解决我的问题,我不得不用 Jenkins 实现这个工作流程:

    < li >对项目进行< code>mvn打包 < li >使用Ansible在远程服务器上部署生成的WAR(我们已经使用Ansible在远程机器上进行夜间部署和其他任务) < li >在不重新编译war的情况下运行远程测试。为此,我必须添加Maven标志< code >-dmaven . compiler . useincrementalcomplation = false (感谢this和this的提示),以便在< code>verify阶段不重新编译工件 < li >检索(< code >转储)JaCoCo覆盖率数据

因此,问题中描述的 Maven 命令已拆分为两个命令:一个命令用于创建包,另一个命令用于执行测试并检索 JaCoCo 数据而无需重新编译工件。

 类似资料:
  • 我有一个问题,在声纳Qube v6.7中,线路覆盖范围低于哈科报告。 当我打开声纳时,我的类文件有很多未覆盖的行。打开 jacoco 报告时,它显示这些行已覆盖。 我正在使用gradle插件。(v2.6) 有什么想法可以是问题吗?

  • 当运行Gradle的Jacoco插件时,我在一组选定的类上得到零代码覆盖率报告。我已经确认测试这些类的所有单元测试都已成功运行。 非常有趣的是,EclEmma在Eclipse中生成了正确的代码覆盖率结果。我已经确认这两个工具使用的是相同版本的Jacoco。 我想知道这两种工具的区别是什么?我需要Gradle Jacoco插件的额外配置吗。 编辑:我的Gradle Jacoco输出显示“com类的执

  • 更新gradle android插件后,我得到了下面的错误。 任务执行失败: App: JacocoTestReport. 无法读取执行数据文件应用/构建/输出/代码覆盖/连接/coverage.ec jacoco version=“0.7.6.201602180812” Android插件版本:'com.android.tools.build: gradle: 2.1.0' 最新的插件有什么问题

  • 我正在运行我的selenium项目模块,它不是主项目的一部分,我用Jacoco maven插件和surefire插件运行selenium测试,Jacoco只给出了selenium项目的代码覆盖(exec文件),而不是整个项目...我需要如何配置我的Jacoco和Surefire以获得外部/整个项目覆盖??

  • 我有一个多模块项目,如下所示: 在这个项目中,服务客户端将实现对我正在调用的任何服务的调用,数据模块将只是数据类。目前,雅各科考虑了所有这些模块。有没有办法排除完整的模块,如数据模块或服务客户模块,因为在这两种情况下都不需要UTs?

  • 我们有一个多模块的maven项目。 每个模块都有一对testng和powermock单元测试用例。我们正在使用jacoco进行代码覆盖率报告。但是,jacoco在分析单元测试复盖率时基于testng单元测试用例,而忽略了powermock单元测试用例。因此,总的代码覆盖率越来越低。 如何配置jacoco来同时获取testng和jacoco测试用例?