繁体   English   中英

SonarQube的覆盖范围缺少Jacoco报告涵盖的某些行

[英]SonarQube coverage missing some lines covered by Jacoco report

当我使用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和本地声纳扫描仪2.8运行。 服务器正在运行Java版本1.8.0_66-b17,SonarQube版本5.6.3和SonarQube Java插件版本4.2.1.6971。

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

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

有关JaCoCo提供的计数器,请参见http://www.eclemma.org/jacoco/trunk/doc/counters.html 以及有关SonarQube显示内容的http://docs.sonarqube.org/display/SONAR/Metric+Definitions 说明范围仅在JaCoCo中提供。

不清楚您的问题是否看到SonarQube和JaCoCo所显示的Foo.java中的覆盖线之间存在差异。 如果是这样,请提供屏幕截图。

事实证明,用于运行单元测试的类文件(也用于生成我的本地报告)与声纳扫描仪使用的文件不同。 这是因为在编译,单元测试和本地报告生成之后, bnd将在类文件上运行并重写@Component类的类文件。 由于sonar-scanner在bnd之后运行,因此它会看到不同的类文件。 看来我的问题不是内部类与外部类,而是OSGi组件与非组件。 Foo类是OSGi组件,而内部类则不是。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM