一般單一模塊的工程,單元測試代碼和被測試代碼是在一起的,通過簡單配置利用jaccoco即可輸出測試結果到sonar中。
但是很多場景,單元測試代碼可能和被測試代碼不在同一個模塊中,這時候,會導致沒有測試代碼的模塊的測試覆蓋率始終是0。雖然另一個模塊的的測試代碼最終導致這個模塊的代碼也被執行了。
jacoco自身有報告合併功能,如果不使用sonar,通過簡單配置,也可以生成完整的測試覆蓋率。
如果使用sonar則要麻煩些,基本思路是,讓每個模塊跑單元測試,並將代碼執行情況彙總到一個jacoco.exec文件,而不是各自項目單獨的,這樣最終對於每個模塊,可以通過完整的jacoco.exec生成完整的測試覆蓋率。
父pom文件設置:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jacoco.version>0.8.4</jacoco.version>
<!-- Sonar -->
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
<!--將所有jacoco定位到同樣的父目錄位置-->
<sonar.jacoco.reportPaths>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPaths>
<sonar.language>java</sonar.language>
</properties>
<modules>
<module>t1</module>
<module>t2</module>
</modules>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>${jacoco.version}</version>
<configuration>
<!--使用前面定義的位置-->
<destFile>${sonar.jacoco.reportPaths}</destFile>
<!--重要!用追加的模式-->
<append>true</append>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
最後使用maven命令行:
clean org.jacoco:jacoco-maven-plugin:prepare-agent install sonar:sonar
完整測試結果就會推送到sonar了。