使用Jenkins Sonar插件构建成功后,Sonar不会显示代码覆盖率



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

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

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

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

有人能帮助我如何获得任何Sonar项目的正确代码覆盖率吗。

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

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

mvn jacoco:prepare-agent test jacoco:report

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

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

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

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

由于OutOfMemoryError:heapspace,未生成coverage.xml。由于我的项目是一个很大的项目,当我将堆内存设置为2GB,将cobertura插件内存设置为1.5GB时,sonar会显示代码覆盖率。

根据这篇博客文章,您可能忘记在项目属性中设置sonar.binaries属性

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

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

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

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

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

在你的情况下,我想它可以阅读junit/testng报告,但找不到jacoco结果(jacoco.exc)。路径声纳输出(../sonar/target/jacoco.exec)正确吗?

最新更新