【问题标题】:Sonar does not shows up Code Coverage after build successful with Jenkins Sonar plugin使用 Jenkins Sonar 插件构建成功后,Sonar 不显示代码覆盖率
【发布时间】:2018-03-05 16:17:47
【问题描述】:

我正在尝试使用 Sonar 和 Jenkins 获得代码覆盖率。我看到 Jenkins 的 Sonar 插件成功执行 JUnit 测试用例并成功完成构建。但是 Sonar 没有在项目中显示代码覆盖率结果(总是显示 0.0% 作为代码覆盖率)。但 Sonar 确实显示“单元测试成功”。

我正在将 Maven 与 Jenkins 和 Sonar 一起使用。

执行 Sonar 插件时,我在 Jenkins 日志中收到以下消息:

项目覆盖率设置为 0%,因为没有转储 JaCoCo 执行数据:.../sonar/target/jacoco.exec

谁能帮助我如何在任何 Sonar 项目中获得正确的代码覆盖率。

【问题讨论】:

  • 您是否阅读了docs.codehaus.org/display/SONAR/… 并尝试了相关的项目示例?如果是这样,您能否提供更详细的信息:日志文件,在您的 pom 文件中配置 SonarQube,您如何运行 SonarQube:mvn clean install / mvn sonar:sonar? SonarQube 等的版本?
  • 我阅读了 docs.codehaus.org/display/SONAR/… 并使用 cobertura 作为我的代码覆盖率插件,然后我看到了小型项目的代码覆盖率显示。当我在声纳中检查大型项目时,我只看到代码覆盖率 - 这意味着它的 empty.in 日志我可以在 .../coverage.xml 路径中找到未找到的 Cobertura 报告。会是什么原因。 cobertura 插件检测在显示上述消息之前运行良好。
  • coverage.xml 由于 OutOfMemeryError:heapspace 未生成。由于我的项目是如此之大,当我将堆内存设置为 2GB 并将 cobertura 插件内存设置为 1.5GB 时,声纳会显示代码覆盖率。

标签: code-coverage sonarqube


【解决方案1】:

仅仅因为 Sonar 正确调用了 Surefire(并且您收到了“单元测试成功”消息)并不意味着 JaCoCo 检测了您的代码。

尝试直接执行 JaCoCo。您可能会发现 JaCoCo 直接失败的原因:

mvn jacoco:prepare-agent test jacoco:report

JaCoCo 将把 jacoco.exec 及其 XML/HTML 报告放在 target/jacoco 中。否则它会失败,希望您能更好地了解原因。

一个非常常见的问题是,如果您完全更改了 Surefire argLine,JaCoCo javaagent 将不会运行,因为jacoco:prepare-agent 只是设置了 argLine 属性,在这种情况下,该属性被方便地忽略.您可以将 prepare-agent 的 propertyName 属性设置为其他内容(例如 jacocoArgLine)并在您的 argLine 配置中包含 that

<argLine>-Xmx1024m ${jacocoArgLine}</argLine>

【讨论】:

  • 很棒的答案,非常感谢。
【解决方案2】:

我阅读了https://docs.sonarqube.org/display/PLUG/Code+Coverage+by+Unit+Tests+for+Java+Project 并使用 cobertura 作为我的代码覆盖率插件,然后我看到了小型项目的代码覆盖率显示。当我在声纳中检查一个大项目时,我只看到代码覆盖率 - 这意味着它是空的。在日志中,我发现在 /.../coverage.xml 路径中找不到 Cobertura 报告。

由于 OutOfMemeryError:heapspace 未生成coverage.xml。由于我的项目是如此之大,当我将堆内存设置为 2GB 并将 cobertura 插件内存设置为 1.5GB 时,声纳会显示代码覆盖率。

【讨论】:

    【解决方案3】:

    根据这个blog post,你可能忘记在你的项目属性中设置sonar.binaries属性

    不要忘记 sonar.binaries,否则,您可能会得到类似 « 项目覆盖率设置为 0%,因为没有包含类的目录。 » 在您的日志中。

    [...]
    sonar.surefire.reportsPath=target/surefire-reports
    sonar.jacoco.reportPath=target/jacoco.exec
    sonar.binaries=target/classes
    [...]
    

    【讨论】:

    • 这只适用于 Java 项目吗?
    【解决方案4】:

    您的 Sonar 插件找不到 Jacoco 生成的报告文件。

    在您的 pom(父或子)中,在 jacoco/prepare-agent 执行下查找 <destFile> 标签。将名称和位置更改为target/jacoco.exec,您就可以开始了!

    【讨论】:

      【解决方案5】:

      不要使用 Jenkins 声纳插件来运行声纳,而是尝试使用 maven,通过执行声纳目标来完成。通常这比设置额外的构建步骤并调整所有路径更容易,直到声纳找到所有相关文件。

      在您的情况下,我猜它可以读取 junit/testng 报告,但找不到 jacoco 结果 (jacoco.exec)。路径声纳输出(../sonar/target/jacoco.exec)是否正确?

      【讨论】:

      • 感谢您回答我的问题。我试过执行 mvn sonar:sonar。但我没有运气,它失败并显示相同的消息项目覆盖率设置为 0%,因为没有转储 JaCoCo 执行数据:/user/mysys/.jenkins/jobs/../workspace/.../sonar/目标/jacoco.exec。是的,它读取单元测试结果,但代码覆盖失败。
      猜你喜欢
      • 1970-01-01
      • 2012-06-30
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2018-07-24
      • 2012-12-22
      相关资源
      最近更新 更多