2016-11-11 57 views
0

當我使用Jacoco代理運行單元測試時,我的本地Jacoco報告與SonarQube上的覆蓋範圍之間存在一些差異。這似乎隻影響包含嵌套類的文件。本地生成的報告具有外部類和所有內部類的覆蓋率信息,但SonarQube上的覆蓋率數據僅包含內部類。SonarQube覆蓋缺失Jacoco報告涵蓋的一些行

例如,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中的行這是我的預期。這一差異彌補了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。

我希望有任何建議,並會很樂意提供更多的細節,如果這將有所幫助。

回答

0

事實證明,用於運行單元測試(也用於生成本地報告)的類文件與聲納掃描程序使用的類文件不同。這是因爲編譯,單元測試和本地報告生成後,將在類文件上運行,並重寫類文件@Component類。由於聲納掃描儀在bnd之後運行,因此會看到不同的類文件。看起來我的問題不是內部類與外部類,而是OSGi組件與非組件; Foo類是一個OSGi組件,而內部類不是。

當我運行在相同的類文件中使用由Jacoco代理掃描器,通過SonarQube報道Foo.java線覆蓋率爲27%(而不是15%),和基於文件的覆蓋視圖符合我的地方報告。

1

「指示」與其他任何東西的比較就像蘋果和橘子的比較 - 它們不代表相同的東西。單行代碼通常包含許多字節碼指令。因此,期望「指令覆蓋率」接近「線路覆蓋率」是錯誤的,例如:如果總共有10條指令中包含100條指令並且覆蓋1條包含20條指令的指令,則錯過指令80%,但是錯過了行90%。

請參閱http://www.eclemma.org/jacoco/trunk/doc/counters.html關於JaCoCo提供的計數器。以及關於SonarQube顯示的http://docs.sonarqube.org/display/SONAR/Metric+Definitions。說明覆蓋範圍僅在JaCoCo中提供。

如果您看到SonarQube顯示的並由JaCoCo顯示的Foo.java中的遮蓋行之間的差異,則不清楚您的問題。如果是這樣,那麼請提供截圖。

+0

感謝您的指點和反饋!我知道線路和指令覆蓋率預計會有所不同。更大的擔憂是SonarQube和JaCoCo對Foo.java的覆蓋範圍有所不同。事實證明,他們使用不同的類文件來執行分析,正如我在答案中所解釋的那樣。抱歉打擾你! –