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 实现这个工作流程:
- 对项目做一个
mvn package
- 使用 Ansible 在远程服务器上部署生成的 WAR(我们已经使用 Ansible 在远程机器上进行夜间部署和其他任务)
- 运行 远程测试无需重新编译战争。为此,我必须添加 Maven 标志
-Dmaven.compiler.useIncrementalCompilation=false
(感谢 this and this 的提示),以便在 verify
阶段 期间不 re-compile 工件]
- 检索 (
dump
) JaCoCo 覆盖率数据
因此问题中描述的 Maven 命令已分为两个命令:一个创建包,一个执行测试并检索 JaCoCo 数据而不重新编译工件。
我正在使用 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 实现这个工作流程:
- 对项目做一个
mvn package
- 使用 Ansible 在远程服务器上部署生成的 WAR(我们已经使用 Ansible 在远程机器上进行夜间部署和其他任务)
- 运行 远程测试无需重新编译战争。为此,我必须添加 Maven 标志
-Dmaven.compiler.useIncrementalCompilation=false
(感谢 this and this 的提示),以便在verify
阶段 期间不 re-compile 工件]
- 检索 (
dump
) JaCoCo 覆盖率数据
因此问题中描述的 Maven 命令已分为两个命令:一个创建包,一个执行测试并检索 JaCoCo 数据而不重新编译工件。