java - SonarQube 覆盖范围缺少 Jacoco 报告覆盖的一些行

标签 java sonarqube jacoco sonarqube-scan

当我使用 Jacoco 代理运行单元测试时,我的本地 Jacoco 报告与 SonarQube 上的覆盖范围之间存在一些差异。这似乎只影响包含嵌套类的文件。本地生成的报告有外部类和所有内部类的覆盖率信息,但SonarQube上的覆盖率数据只包括内部类。

例如,Foo.java 包含外部类 Foo 和内部类 Bar 和 Baz。

我的本​​地报告显示 Foo 类的指令覆盖率为 26%,Foo.Bar 类为 46%,Foo.Baz 类为 0%; Foo.java 的总体指令覆盖率为 30%。 SonarQube 覆盖率页面给出 Foo.java 的行覆盖率为 15%。我知道行覆盖率并不等于指令覆盖率,但我希望数字更接近。经过进一步检查,我注意到在 SonarQube 上 Foo.java 基于文件的覆盖 View 中,外部类 Foo 中的所有行都被标记为“单元测试未覆盖”,并且唯一标记为覆盖的行是 Foo 中的行.酒吧如我所料。这一差异弥补了 Jacoco 报告与 SonarQube 之间约 15% 的差距。我在本地扫描仪日志或服务器分析日志中没有看到任何异常。

我在本地运行 JaCoCo 0.7.7.201606060606、Java 版本 1.8.0_73 和 Sonar 扫描仪 2.8。服务器运行的是 Java 版本 1.8.0_66-b17、SonarQube 版本 5.6.3 和 SonarQube Java 插件版本 4.2.1.6971。

如果有任何建议,我将不胜感激,并且很乐意提供更多详细信息(如果有帮助的话)。

最佳答案

“说明”与其他任何内容的比较就像苹果和橙子的比较 - 它们并不代表同一件事。单行代码通常包含许多字节码指令。因此,期望“指令覆盖率”接近“行覆盖率”是错误的,例如:如果总共 10 行中有 100 条指令,并且用 20 条指令覆盖 1 行,则错过指令 80%,但错过行90%。

参见http://www.eclemma.org/jacoco/trunk/doc/counters.html关于 JaCoCo 提供的计数器。和http://docs.sonarqube.org/display/SONAR/Metric+Definitions关于 SonarQube 显示的内容。指令覆盖范围仅在 JaCoCo 中呈现。

如果您发现 SonarQube 和 JaCoCo 显示的 Foo.java 中覆盖的行之间存在差异,则从您的问题中不清楚。如果是的话,请提供截图。

关于java - SonarQube 覆盖范围缺少 Jacoco 报告覆盖的一些行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40554576/

相关文章:

java - 如何以及何时使用(或不使用)三种特定情况下的异常(exception)情况?

java - Jersey 长时间运行请求超时

java - SonarLint 在 VSCode 上缺少 Java 规则

gwt - emma/sonar/jacoco 的代码覆盖率

jenkins - WaitForQualityGate 退出并在 Jenkins slave 上出现错误

kotlin - 如何覆盖Kotlin生成的不必要的空检查?

java - Jenkins 的代码覆盖率

java - itext 包错误

Java 程序帮助

java - Jacoco:对于报告生成,必须使用与运行时相同的类文件