(翻譯)Android應用生成測試覆蓋率報告
對於使用AndroidJUnit4 runner建立的Android整合測試用例,之前一直都沒有發現,一種合適的產生程式碼覆蓋率的方式。我曾經嘗試過很多方式,但是要不就是不奏效,要不就是隻合適我現在已經不再使用的Robolectric測試框架,其他開發者,也漸漸不再新專案中使用這個測試框架了。比如Square的Sqlbrite專案,現在已經開始採用AndroidJUnit4 runner進行他們的專案測試。最近,我在Reddit上面發現了一個有趣的討論,從中我發現了一個不需要額外外掛,指令碼和多行配置就可以簡單生成程式碼覆蓋率的方式,Android SDK 現在已經內建了對 Emma Test Coverage
我們只要做的一件事,就是在 build.gradle
中應用jacoco—android
外掛。
apply plugin: 'jacoco-android'
譯者批註
在高版本的SDK中,上述外掛也不需要引用
然後參照如下示例,將 testCoverageEnabled
設定為 true
android {
buildTypes {
debug {
testCoverageEnabled = true
}
}
}
為了能生成程式碼覆蓋率報告,我們需要將Android裝置或者模擬器連線到計算機,因為 在生成報告前,會執行 connectedCheck
之後,我們可以執行如下的命令列
./gradlew createDebugCoverageReport
該任務會分析 /src/main/java/
路徑下的程式碼和 /src/androidTest/java/
目錄下單元測試用例。
在執行這個任務之後,我們可以在模組的如下路徑中找到程式碼覆蓋率報告
/build/outputs/reports/coverage/debug/
我們可以在瀏覽器中開啟 index.html 檔案,可以看見視覺化的報告。
同時,在同一級目錄下,我們也可以找到可以供持續整合覆蓋率分析使用的 report.xml 檔案。
除了上面提到的檔案,Gradle也會在如下的路徑建立 coverage.ec
/build/outputs/code-coverage/connected/
某些情況下,我們可能需要這些檔案,比如在選擇Jenkins外掛或者別的工具生成程式碼覆蓋率的時候。
下面,你能看見一個 Android 開源專案,Presfer,的程式碼覆蓋率報告。
這是一份由 JaCoCo 程式碼覆蓋率庫生成的報告。
通過分析報告,我增加了部分新的測試用例,小幅度優化了部分程式碼,使得專案的覆蓋率達到了 100%。
為了能在 Jenkins CI 上釋出報告,可以使用程式碼覆蓋率外掛,但是並不能確認外掛的穩定性。另一種解決方案是 HTML Publisher plugin,我們可以增加相應動作,在 Jenkins 的任務中,通過預設的HTML介面產生覆蓋率報告,我認為這是一種非常方便的方式,易於建立,並且方便進行程式碼導航,能定位到沒有覆蓋的程式碼行,方法和分支。
我們可以方便的觀察到Android專案的程式碼覆蓋情況通過這種簡潔快捷的方式,能幫助我們最終發現專案的瓶頸所在,增加應用或者lib庫的整體質量