2

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

测试架构

我的 Maven 项目配置了JMeter Maven 插件verify,以便在 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

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

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

本地测试覆盖结果

Jenkins 的覆盖结果

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

4

1 回答 1

1

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

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

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

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

于 2017-01-18T13:40:14.417 回答