当我使用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。
如果有任何建议我会很感激,如果有帮助的话,我会很乐意提供更多细节。
答案 0 :(得分:1)
“指令”与其他任何东西的比较就像苹果和橙子的比较 - 它们不代表同一件事。单行代码通常包含许多字节码指令。因此,期望“指令覆盖”接近“线路覆盖”是错误的,例如:如果总共10条线路中有100条指令并且覆盖1条线路有20条指令,那么错过指令80%,但错过线路90%。
有关JaCoCo提供的计数器,请参阅http://www.eclemma.org/jacoco/trunk/doc/counters.html。关于SonarQube显示的内容http://docs.sonarqube.org/display/SONAR/Metric+Definitions。说明范围仅在JaCoCo中提供。
如果你看到SonarQube展示的Foo.java
和JaCoCo展示的界线之间存在差异,那么你的问题就不清楚了。如果是,请提供截图。
答案 1 :(得分:0)
事实证明,用于运行单元测试的类文件(也用于生成本地报告)与声纳扫描器使用的类文件不同。这是因为在编译,单元测试和本地报告生成之后, bnd 会在类文件上运行,并重写 @Component 类的类文件。因为声纳扫描器是在bnd之后运行的,所以它会看到不同的类文件。看起来我的问题不是内部类和外部类,而是OSGi组件与非组件; class Foo是一个OSGi组件,内部类不是。
当我在Jacoco代理使用的相同类文件上运行扫描程序时,SonarQube报告的Foo.java的行覆盖率为27%(而非15%),基于文件的覆盖率视图与本地报告匹配