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

|