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 | 在測試裝置上執行測試時,使用涵蓋率代理程式 |
| 報表中的類別 | 所有已編譯的類別,但不包括標註為產生的程式碼,例如 Dagger 工廠 | 在模組來源資料夾中含有來源檔案的類別,包括 Dagger 工廠 |
| 指令計數 | Java 位元碼指令 | DEX 位元碼指令 |
| 分支版本數量 | Java 位元碼中的分支 | DEX 位元碼中的分支。D8 可將條件編譯成不同分支,而各項工具會排除不同的編譯器生成分支,因此計數可能不同。 |
| 計數器 | 指令、分支、行、複雜度、方法和類別 | 指令、分支、行、方法和類別。目前不支援複雜度計數器。 |
| 測試裝置 | 應用程式支援的所有 API 級別 | Android 9 以上版本 (API 層級 28) |
| 原始涵蓋率資料 | .ec 個檔案 |
coverage_metadata.pb 和 coverage_hits.pb 檔案 |
如要切換回建構階段程式碼涵蓋率,請設定 android.experimental.androidTest.coverage.useOnDeviceAgent=false 或移除屬性。您不需要變更建構檔案或執行的工作。
已知問題
裝置端程式碼涵蓋率有下列已知問題:
- 產生的程式碼:裝置端報表包含產生的程式碼,例如 Dagger 工廠,建構階段報表通常會略過這些程式碼。如果測試未執行這段程式碼,則會計為未涵蓋。
- 匯總報表:如果專案也會收集主機測試 (例如單元測試) 的涵蓋率,
testAllSuites和testAllSuitesWithDependencies任務建立的匯總涵蓋率報表,會將這些測試的 Java 位元碼計數與代理程式的 DEX 位元碼計數合併。由於兩者之間存在差異,匯總的指令和分支版本編號可能會與建構時程式碼涵蓋率報表中的編號不同。
如要回報其他意見和問題,請使用 Issue Tracker。