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

标签 java maven jenkins jacoco jacoco-maven-plugin

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

Tests architecture

我的 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 项目名称相关的某些约束)?

最佳答案

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

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

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

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

关于java - JaCoCo 插件提供不同的覆盖范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41700428/

相关文章:

java - wro4j 的 LessCssProcessor 导入和声明

java - bash:jar:找不到命令

php - 使用 Jenkins CI 进行单元测试

eclipse - eclipse(开普勒):maven插件(m2e,1.4.0):

java - 在服务器上运行 Maven Web 应用程序

java - hibernate 条件 : Return different entity type than rooted entity?

java - 使用 Roaster,如何生成具有特定泛型类型(或类型)的接口(interface)?

git - 如何在不使用 Jenkins git 插件 checkout 文件的情况下获取分支上的最新提交

java - webdriver 单击网页中的链接

java - Spring MVC 错误消息