本文介紹了如何利用JaCoCo生成單元測試及覆蓋率報告并在Jenkins顯示測試報告結果。
本文首發(fā):http://yuweiguocn.github.io/
新浪微博:@于衛(wèi)國
《西江月·夜行黃沙道中》
明月別枝驚鵲,清風半夜鳴蟬瞒滴。
稻花香里說豐年。聽取蛙聲一片。
七八個星天外弦疮,兩三點雨山前。
舊時茅店社林邊蜘醋,路轉溪橋忽見。
—宋咏尝,辛棄疾
集成JaCoCo
Jacoco的全稱為Java Code Coverage(Java代碼覆蓋率)压语,可以生成java的單元測試代碼覆蓋率報告。
新建一個jacoco.gradle
文件编检,并輸入以下內容:
apply plugin: 'jacoco'
jacoco {
toolVersion = "0.7.7.201606060606" //指定jacoco的版本
reportsDir = file("$buildDir/JacocoReport") //指定jacoco生成報告的文件夾
}
//依賴于testDebugUnitTest任務
task jacocoTestReport(type: JacocoReport, dependsOn: 'testDebugUnitTest') {
group = "reporting" //指定task的分組
reports {
xml.enabled = true //開啟xml報告
html.enabled = true //開啟html報告
}
def debugTree = fileTree(dir: "${buildDir}/intermediates/classes/debug",
includes: ["**/*Presenter.*"],
excludes: ["*.*"])//指定類文件夾胎食、包含類的規(guī)則及排除類的規(guī)則,這里我們生成所有Presenter類的測試報告
def mainSrc = "${project.projectDir}/src/main/java" //指定源碼目錄
sourceDirectories = files([mainSrc])
classDirectories = files([debugTree])
executionData = files("${buildDir}/jacoco/testDebugUnitTest.exec")//指定報告數(shù)據(jù)的路徑
}
然后在應用Module下的build.gradle
文件中引用剛新建的gradle文件:
apply from: 'jacocotest.gradle'
同步sync工程之后可以在任務列表看到新增加的任務:
圖 jacocoTestReport任務
雙擊執(zhí)行任務后可以在Build文件夾找到生成的覆蓋率報告:
圖 單元測試結果目錄結構
其中testDebugUnitTest任務會生成單元測試結果報告允懂,包含xml及html格式分別對應test-results和reports文件夾厕怜;jacocoTestReport任務會生成單元測試覆蓋率報告,結果存放在jacoco和JacocoReport文件夾蕾总。
圖 單元測試HTML報告結果
圖 單元測試覆蓋率報告概覽
圖 單元測試覆蓋率類報告概覽
圖 單元測試覆蓋率類覆蓋情況
可以看到覆蓋情況被不同的顏色標識出來粥航,其中綠色表示代碼被單元測試覆蓋到,黃色表示部分覆蓋生百,紅色則表示完全沒有覆蓋到递雀。
Jenkins配置
在Jenkins上配置好倉庫地址及分支,然后通過shell執(zhí)行gradle任務生成測試報告:
./gradlew clean jacocoTestReport --info
在增加構建后操作步驟添加發(fā)布單元測試報告及JaCoCo覆蓋率報告:
圖 增加構建后操作步驟
注:如果沒有JaCoCo覆蓋率功能蚀浆,請先安裝JaCoCo插件缀程,插件地址:https://wiki.jenkins.io/display/JENKINS/JaCoCo+Plugin
圖 單元測試報告及覆蓋率配置
構建成功后可以在狀態(tài)頁面看到最新測試結果、測試結果趨勢及代碼覆蓋率趨勢:
圖 Jenkins工程頁面
點擊趨勢圖表可以看到更詳細的和本地生成的報告類似的頁面市俊。
常見問題
1.本地生成的單元測試覆蓋率報告正常杨凑,但在Jenkins顯示的單元測試覆蓋率全是0%。
解決方案:此為JaCoCo的一個bug摆昧,請嘗試更新JaCoCo版本解決此問題撩满。遇到有問題的版本號是0.7.4.201502262128,更新為0.7.7.201606060606版本后解決此問題。如果沒能解決請參考stackoverflow中的解決方案鹦牛。