Android Gradle プラグイン(AGP)は、オンデバイス カバレッジ エージェントを使用して、インストルメンテーション テストのコード カバレッジ レポートを作成できます。デフォルトでは、AGP はアプリのビルド時に JaCoCo を使用してアプリのクラスを計測します。つまり、テストで実行されるアプリの部分を記録するコードが追加されます。オンデバイス カバレッジ エージェントを使用すると、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 レポートを生成するため、両方のプロパティが必要です。
デバイス上のコード カバレッジ レポートを生成する
インストルメンテーション テストを実行してカバレッジ レポートを生成するには、デバイスを接続するかエミュレータを起動して、次のタスクを実行します。
| 対象範囲スコープ | コマンド | レポートの場所 |
|---|---|---|
| 1 つのバリアント | ./gradlew :module-name:createVariantNameAndroidTestCoverageReport |
path-to-your-project/module-name/build/reports/coverage/androidTest/variant/connected/index.html |
ビルド時のコード カバレッジとの違い
デバイス上とビルド時のカバレッジ レポートでは、同じテストでも異なる結果が表示されることがあります。2 つのレポートを比較する場合や、カバレッジのしきい値を一方から他方に移動する場合は、次の違いに注意してください。
| 地域 | ビルド時のコード カバレッジ | デバイス上のコード カバレッジ |
|---|---|---|
| クラスがインストゥルメントされるタイミング | 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 バイトコード数を組み合わせたものになります。2 つの違いにより、集計された命令数とブランチ数は、ビルド時のコード カバレッジ レポートの数値と異なる場合があります。
その他のフィードバックや問題については、Issue Tracker から報告してください。