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

时间:2017-01-17 15:02:25

标签: java maven jenkins jacoco jacoco-maven-plugin

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

Tests architecture

My 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服务器。

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

Coverage result for local test

Coverage result with Jenkins

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

1 个答案:

答案 0 :(得分:1)

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

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

  1. 在项目上执行mvn package
  2. 使用Ansible在远程服务器上部署生成的WAR(我们已经在远程计算机上使用Ansible进行夜间部署和其他任务)
  3. 运行远程测试而不重新编译战争。要做到这一点,我必须添加Maven标志-Dmaven.compiler.useIncrementalCompilation=false(感谢thisthis提示),以便在verify阶段不重新编译工件
  4. 检索(dump)JaCoCo覆盖数据
  5. 因此,问题中描述的Maven命令分为两个命令:一个创建包,另一个执行测试并检索JaCoCo数据而不重新编译工件。