JaCoCo 插件提供不同的覆盖范围

JaCoCo plugin gives different coverage

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

我的 Maven 项目配置了 JMeter Maven plugin 以在 Maven verify 阶段执行一些 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

如您所见,测试首先通过 verify 阶段执行,然后 jacoco:dump 目标从测试服务器检索覆盖率数据(我将服务器配置为 运行 JaCoCo 代理),最后数据上传到我的 Sonar 服务器。

我遇到的 "strange" 行为是,如果我 运行 在我的计算机上执行此命令,然后在 SonarQube 页面的 Jenkins 上(相应地配置 Jenkins 项目),我会得到不同的覆盖率结果.此外,如果我配置 Jenkins 项目然后我简单地复制它创建一个新的(但等效的)Jenkins 项目,结果是不同的。

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

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

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

  1. 对项目做一个mvn package
  2. 使用 Ansible 在远程服务器上部署生成的 WAR(我们已经使用 Ansible 在远程机器上进行夜间部署和其他任务)
  3. 运行 远程测试无需重新编译战争。为此,我必须添加 Maven 标志 -Dmaven.compiler.useIncrementalCompilation=false(感谢 this and this 的提示),以便在 verify 阶段
  4. 期间不 re-compile 工件]
  5. 检索 (dump) JaCoCo 覆盖率数据

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