Java JaCoCo插件提供了不同的覆盖范围
我正在使用jacomaven插件和代理来测量和检索每晚测试的应用程序的代码覆盖率数据。 这是体系结构的模式: 我的Maven项目配置为在MavenJava JaCoCo插件提供了不同的覆盖范围,java,maven,jenkins,jacoco,jacoco-maven-plugin,Java,Maven,Jenkins,Jacoco,Jacoco Maven Plugin,我正在使用jacomaven插件和代理来测量和检索每晚测试的应用程序的代码覆盖率数据。 这是体系结构的模式: 我的Maven项目配置为在Mavenverify阶段执行一些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
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
如您所见,首先通过验证阶段执行测试,然后jacoco:dump
目标从测试服务器检索覆盖率数据(我将服务器配置为运行jacoco代理),最后将数据上传到我的Sonar服务器
我的“奇怪”行为是,如果我在我的计算机上运行此命令,然后在SonarQube页面的Jenkins(相应地配置Jenkins项目)上运行此命令,我会得到不同的覆盖结果。此外,如果我配置Jenkins项目,然后简单地复制它,创建一个新的(但等效的)Jenkins项目,结果是不同的
我尝试了不同的配置和案例,但我无法理解问题可能是什么。我是否没有考虑一些JaCoCo约束(例如与Jenkins项目名称相关的约束)?如问题注释中所述,部署在测试服务器上的工件和在生成报告的验证
阶段编译的工件必须完全相同,因此代码相同是不够的
为了解决我的问题,我必须与Jenkins一起实施此工作流:
对项目执行mvn包
使用Ansible在远程服务器上部署生成的WAR(我们已经在远程机器上使用Ansible进行夜间部署和其他任务)
运行远程测试而不重新编译WAR。为此,我必须添加Maven标志-Dmaven.compiler.useIncrementalCompilation=false
(感谢和提示),以便在验证
阶段不重新编译工件
检索(dump
)JaCoCo覆盖率数据
因此,问题中描述的Maven命令被分为两个命令:一个是创建包的命令,另一个是执行测试并检索JaCoCo数据的命令,而无需重新编译工件。很少有详细信息-如何将项目的代码拉到jenkins,结果有什么不同(您是如何看到的?您在哪里看到的)?@nullpointer Jenkins项目被配置为在每次执行时通过“源代码管理”步骤提取代码。本地副本和提取副本之间没有区别,因为没有人在项目上推送任何内容我(作为JaCoCo开发人员)的两个注释:生成报告期间使用的类文件应与类文件匹配(相同)在您的测试服务器上检测以生成jacoco it.exec
-检查这一点。同时向下钻取两个不同的报告,您可以找出导致总体值差异的类-可用于进一步调试。如前所述,远程服务器应运行稍后将进行分析的类生成报告。这种匹配是必需的,因为否则无法保证报告准确显示执行的内容。有关更多详细信息,请参阅。对不起,您的设置非常复杂,因此很难准确地告诉您如何实现这一点。