SonarQube 覆盖缺少 Jacoco 报告涵盖的一些行

Posted

技术标签:

【中文标题】SonarQube 覆盖缺少 Jacoco 报告涵盖的一些行【英文标题】:SonarQube coverage missing some lines covered by Jacoco report 【发布时间】:2017-03-26 01:45:45 【问题描述】:

当我使用 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 的基于文件的覆盖视图中,外部类 Foo 中的所有行都标记为“未被单元测试覆盖”,唯一标记为覆盖的行是 Foo 中的行.Bar 我所期望的。这种差异弥补了 Jacoco 报告和 SonarQube 之间大约 15% 的差距。我在本地扫描仪日志或服务器分析日志中没有看到任何异常。

我在本地运行 JaCoCo 0.7.7.201606060606、Java 版本 1.8.0_73 和 sonar-scanner 2.8。服务器运行 Java 版本 1.8.0_66-b17、SonarQube 版本 5.6.3 和 SonarQube Java 插件版本 4.2.1.6971。

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

【问题讨论】:

【参考方案1】:

事实证明,用于运行单元测试的类文件(也用于生成我的本地报告)与 sonar-scanner 使用的类文件不同。这是因为在编译、单元测试和本地报告生成之后,bnd 会在类文件上运行并重写@Component 类的类文件。因为 sonar-scanner 在 bnd 之后运行,所以它会看到不同的类文件。似乎我的问题不是内部类与外部类,而是 OSGi 组件与非组件; class Foo 是一个 OSGi 组件,内部类不是。

当我对 Jacoco 代理使用的相同类文件运行扫描程序时,SonarQube 报告的 Foo.java 的行覆盖率为 27%(而不是 15%),并且基于文件的覆盖率视图与我的本地报告匹配.

【讨论】:

【参考方案2】:

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

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

如果您看到 SonarQube 显示的 Foo.java 中的覆盖线与 JaCoCo 显示的覆盖线之间的差异,您的问题并不清楚。如果有,请提供截图。

【讨论】:

感谢您的指点和反馈!我了解线路和说明覆盖范围预计会有所不同。更大的担忧是 Foo.java 的 SonarQube 和 JaCoCo 中覆盖行的差异。事实证明,正如我在回答中解释的那样,他们使用不同的类文件来执行分析。很抱歉打扰您!

以上是关于SonarQube 覆盖缺少 Jacoco 报告涵盖的一些行的主要内容,如果未能解决你的问题,请参考以下文章

ANT 任务:使用 JaCoCo 的 SonarQube 扫描仪代码覆盖率报告

Sonarqube + Jacoco - 声纳不会从属性中读取报告路径

Sonar是否使用Jacoco插件进行代码覆盖

SonarQube 没有获得单元测试覆盖率

使用 Powermock 在 Sonarqube 中配置 jacoco 以进行集成和单元测试报告

带有 jacoco 插件的 SonarQube 覆盖百分比显示为零,但可以看到单元测试的数量