maven多模塊工程jacoco、sonar單元測試覆蓋率及集成測試覆蓋率

一、針對Sonarqube 8.x版本

官方有例子,鏈接如下

https://github.com/SonarSource/sonar-scanning-examples/tree/master/sonarqube-scanner-maven/maven-multimodule

該版本已經要求儘量用xml格式的jacoco report,exec格式的僅支持Java了,見下

https://docs.sonarqube.org/latest/analysis/coverage/

上面的例子上報的8.x版本的sonarqube時,覆蓋率是算上了tests模塊的測試代碼;但是當上報到6.x版本時 sonar.coverage.jacoco.xmlReportsPaths是不行的,還是會用jacoco.exec,此時測試覆蓋率沒有算上tests模塊的代碼。

二、針對sonarqube6.x版本,可以把所有模塊的jacoco.exec追加到一個jacoco.exec裏面,這樣就可以實現上面的效果

參考 https://blog.csdn.net/qq_16414307/article/details/99573390

一般單一模塊的工程,單元測試代碼和被測試代碼是在一起的,通過簡單配置利用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了。

注意:當在maven中配置maven-sufire-plugin時,如果添加了argLine,一定要寫成下面的樣子

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${surefire.version}</version>
    <configuration>
        <argLine>${argLine} -xxxx</destFile>
    </configuration>
</plugin>

即,不要忘了 ${argLine},否則不會生成jacoco報告

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章