16

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

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

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

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

任何人都可以帮助我如何在任何 Sonar 项目中获得正确的代码覆盖率。

4

5 回答 5

12

仅仅因为 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 配置中:

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

于 2013-09-06T04:18:18.457 回答
3

我阅读了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 时,声纳会显示代码覆盖率。

于 2013-09-12T06:53:27.457 回答
2

根据this blog post,您可能忘记sonar.binaries在项目属性中设置属性

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

[...]
sonar.surefire.reportsPath=target/surefire-reports
sonar.jacoco.reportPath=target/jacoco.exec
sonar.binaries=target/classes
[...]
于 2017-12-08T09:45:28.920 回答
2

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

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

于 2018-03-05T08:17:47.310 回答
0

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

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

于 2013-08-27T06:12:25.930 回答