以前做統(tǒng)計代碼測試覆蓋,一般用Cobertura。以前統(tǒng)計測試覆蓋率,一般只算Unit Test,或者閉上眼睛把Unit Test和Integration Test一起算。
但是,我們已經(jīng)過了迷信UT的時代:
- UT不支持大幅度重構(gòu),如果對類和方法進行重構(gòu)拆分,UT就失去了保障重構(gòu)后代碼仍然正確的作用,還要花時間按新的類和方法重寫,其他用例對舊類和方法的mock改起來也是噩夢。
- UT不支持基于用戶故事的測試,即使覆蓋率100%了,也不保證就是產(chǎn)品經(jīng)理想要的東西。
- UT對輸入?yún)?shù)和Mock對象行為的假設(shè),其實存在潛在的風險
- 多線程,網(wǎng)絡(luò)等等難于測試的地方。
在我看來,使用嵌入式容器的集成測試,如Spring Boot所倡導的基于嵌入式Jetty,H2等等的一整套集成測試體系,集合了UT(可本地快速運行,可直接assert應用內(nèi)部屬性,可統(tǒng)計覆蓋率,如果CI失敗了可以本地單獨運行、debug、修復失敗的case再提交)與FT(基于用戶故事黑盒測試)的優(yōu)點,對項目質(zhì)量保證的地位一點不比UT低,所以同樣需要計算覆蓋率,而不是傳統(tǒng)測試金字塔模型,只依賴UT的覆蓋率。
所以Sonar + Jacoco 這種同時顯示UT和IT測試覆蓋率的組合非常實用。
照抄Sonar自帶的Maven UT/IT示例項目,用maven插件,很容易就能跑出效果來,略。
花了我半天時間的,是如何用Jenkins上的SonarQubeRunner,跑出相同的效果,因為SonarQubeRunner不認識Maven是誰。
網(wǎng)上都是半新半舊,不咸不淡的文章,自己又摸索了一輪,得出一個只要一條不漏,便保證能跑的Jenkins + Maven + Sonar + Jacoco配置
在Jenkins上使用最新的SonarQube Runner 2.4,填入下面的配置
sonar.projectKey=xxx
sonar.projectName=xxx
sonar.projectVersion=xxx
sonar.modules=moduleA,moduleB,IT module C
#這里假設(shè)moduleA,moduleB 在根目錄下的一層目錄,Module C在二層目錄下,需額外定義
#moduleC.projectBaseDir=xxx/moduleC
sonar.sourceEncoding=UTF-8
sonar.language=java
sonar.sources=src/main/java
sonar.tests=src/test/java
sonar.binaries=target/classes
#排除一些不想統(tǒng)計的類
#sonar.exclusions=**/*IDL.java
sonar.java.coveragePlugin=jacoco
sonar.jacoco.itReportPath=xxx/moduleC/target/jacoco-it.exec,最好寫成絕對路徑
sonar.junit.reportsPath=target/surefire-reports
sonar.surefire.reportsPath=target/surefire-reports
廣州今天繼續(xù)熱的要命

|