Android Gradle 外掛程式 (AGP) 可使用裝置端涵蓋率代理程式,為檢測設備測試建立程式碼涵蓋率報表。根據預設,AGP 會在建構應用程式時,使用 JaCoCo 檢測應用程式的類別,也就是說,AGP 會新增程式碼,記錄測試執行的應用程式部分。有了裝置端涵蓋率代理程式,AGP 建構應用程式時就不會加入這類額外程式碼,而代理程式會在測試裝置上檢測應用程式的類別,同時執行測試。本頁說明如何啟用裝置端程式碼涵蓋率,以及如何產生報表。
與建構階段程式碼涵蓋率相比,裝置端程式碼涵蓋率具有下列優點:
- 加快建構速度:AGP 不會對應用程式的類別及其依附元件執行 JaCoCo 檢測步驟,因此建構時間可縮短 10% 到 20%。
- 縮減偵錯 APK 大小:AGP 不會將涵蓋率追蹤程式碼新增至應用程式的類別,因此偵錯 APK 大小可縮減 20% 至 25%。
- 報表中沒有未使用的生成類別:測試未使用的生成類別不會降低涵蓋率。
實際建構時間和 APK 大小改善幅度取決於您的專案。
必要條件
如要使用裝置端程式碼涵蓋率,請確認專案和測試裝置符合下列規定:
- AGP 9.6.0-alpha01 以上版本。
- 搭載 Android 9 (API 級別 28) 以上版本的裝置或模擬器。
- 測試變體的偵錯建構類型,例如預設的
debug建構類型。代理程式只能附加至可進行偵錯的應用程式。 - 使用
AndroidJUnitRunner或擴充該類別的自訂測試執行器執行的檢測設備測試。
啟用裝置端程式碼涵蓋率
裝置端程式碼涵蓋率使用的 enableAndroidTestCoverage 屬性與建構階段程式碼涵蓋率相同。在模組層級建構檔案中,將每個要取得涵蓋率報表的變化版本的 enableAndroidTestCoverage 設為 true:
Kotlin
android {
// ...
buildTypes {
debug {
// Enable coverage for instrumentation tests
enableAndroidTestCoverage = true
}
}
}
Groovy
android {
// ...
buildTypes {
debug {
// Enable coverage for instrumentation tests
enableAndroidTestCoverage true
}
}
}
接著,在專案的 gradle.properties 檔案中啟用裝置端涵蓋率代理程式和報表匯總功能:
android.experimental.androidTest.coverage.useOnDeviceAgent=true
android.experimental.reportAggregationSupport=true
裝置端程式碼涵蓋率會使用與統一程式碼涵蓋率報表相同的轉譯器產生 HTML 報表,因此需要這兩項屬性。
產生裝置端程式碼涵蓋率報表
如要執行檢測設備測試並產生涵蓋率報表,請連結裝置或啟動模擬器,然後執行下列工作:
| 涵蓋範圍 | 指令 | 報告位置 |
|---|---|---|
| 一個變化版本 | ./gradlew :module-name:createVariantNameAndroidTestCoverageReport |
path-to-your-project/module-name/build/reports/coverage/androidTest/variant/connected/index.html |
與建構階段程式碼涵蓋率的差異
裝置端和建構時涵蓋率報表可能會針對相同測試顯示不同結果。比較這兩份報表,或將涵蓋率門檻從一份報表移至另一份報表時,請留意下列差異:
| 領域 | 建構時程式碼涵蓋率 | 裝置端程式碼涵蓋率 |
|---|---|---|
| 檢測類別時 | AGP 建構應用程式時,會使用 JaCoCo | 在測試裝置上執行測試時,使用涵蓋率代理程式 |
| 報表中的類別 | 模組中的所有類別 | 只有模組命名空間中在測試執行時載入的類別,因此涵蓋率百分比可能較高 |
| 指令計數 | Java 位元碼指令 | DEX 位元碼指令 |
| 分支計數 | Java 位元碼中的分支 | DEX 位元碼中的分支。D8 可將條件編譯成不同分支,而每項工具都會省略不同的編譯器生成分支,因此計數可能不同。 |
| 計數器 | 指令、分支、行、複雜度、方法和類別 | 指令、分支、行、方法和類別。目前不支援複雜度計數器。 |
| 測試裝置 | 應用程式支援的所有 API 級別 | Android 9 以上版本 (API 層級 28) |
| 原始涵蓋率資料 | .ec 個檔案 |
coverage_metadata.pb 和 coverage_hits.pb 檔案 |
如要切換回建構階段程式碼涵蓋率,請設定 android.experimental.androidTest.coverage.useOnDeviceAgent=false 或移除屬性。您不需要變更建構檔案或執行的工作。
已知問題
裝置端程式碼涵蓋率有下列已知問題:
- 未載入的類別:測試執行期間未載入的類別不會顯示在報告中。建構階段程式碼涵蓋率報表會將這些檔案列為 0% 涵蓋率。
- 匯總報表:如果專案也會從主機測試 (例如單元測試) 收集涵蓋率,
testAllSuites和testAllSuitesWithDependencies工作建立的匯總涵蓋率報表,會將這些測試的 Java 位元碼計數與代理程式的 DEX 位元碼計數合併。由於兩者之間存在差異,匯總的指令和分支數量可能與建構階段程式碼涵蓋率報表中的數量不同。
請透過 Issue Tracker 回報其他意見和問題。