Gradle で管理されているデバイスを使用すると、自動インストルメンテーション テストの整合性、パフォーマンス、信頼性が向上します。API レベル 27 以上で利用可能なこの機能により、プロジェクトの Gradle ファイルで仮想テストデバイスを構成できます。この構成は、自動テスト実行時にこれらのデバイスを完全に管理(つまり、作成、デプロイ、破棄)するために、ビルドシステムによって使用されます。
この機能を使用すると、Gradle は実行中のテストだけでなく、デバイスのライフサイクルも把握できるため、テスト エクスペリエンスの品質が次のように向上します。
- テストを確実に実行するために、デバイス関連の問題に対応する
- エミュレータ スナップショットを利用して、デバイスの起動時間とメモリ使用量を改善し、テストの合間にデバイスをクリーンな状態に戻す
- テスト結果をキャッシュに保存し、異なる結果が得られる可能性のあるテストのみを再実行する
- 一貫したテスト環境で、ローカルテストとリモートテストを実行する
また、Gradle で管理されているデバイスには、自動テストデバイス(ATD)という、新しいタイプのエミュレータ デバイスが導入されています。これは、インストルメンテーション テストの実行時にパフォーマンスを向上させるように最適化されています。テストのシャーディングのサポートと組み合わせることで、テストスイート実行を複数の ATD インスタンスに分割して試行し、テスト実行時間全体を短縮できます。
Gradle で管理されているデバイスを作成する
モジュール レベルの build.gradle
ファイルで、Gradle がアプリのテストに使用する仮想デバイスを指定できます。次のコードサンプルは、API レベル 30 を搭載した Pixel 2 を Gradle で管理されているデバイスとして作成します。
Groovy
android { testOptions { managedDevices { devices { pixel2api30 (com.android.build.api.dsl.ManagedVirtualDevice) { // Use device profiles you typically see in Android Studio. device = "Pixel 2" // Use only API levels 27 and higher. apiLevel = 30 // To include Google services, use "google". systemImageSource = "aosp" } } } } }
Kotlin
android { testOptions { managedDevices { devices { maybeCreate<com.android.build.api.dsl.ManagedVirtualDevice>("pixel2api30").apply { // Use device profiles you typically see in Android Studio. device = "Pixel 2" // Use only API levels 27 and higher. apiLevel = 30 // To include Google services, use "google". systemImageSource = "aosp" } } } } }
構成した Gradle で管理されているデバイスを使用してテストを実行するには、次のコマンドを使用します。device-name
は、Gradle ビルド スクリプトで構成したデバイス名(pixel2api30
など)で、BuildVariant
は、テストするアプリのビルド バリアントです。
gradlew device-nameBuildVariantAndroidTest
デバイスのグループを定義する
さまざまな API レベルやフォーム ファクタなど、複数のデバイス設定でテストをスケーリングするには、Gradle で管理するデバイスを複数定義し、名前付きグループに追加します。これにより、Gradle はグループ内のすべてのデバイスに対して、テストを同時に実行できます。
次の例は、phoneAndTablet
というデバイス グループに追加された 2 つの管理対象デバイスを示しています。
Groovy
testOptions { managedDevices { devices { pixel2api29 (com.android.build.api.dsl.ManagedVirtualDevice) { ... } nexus9api30 (com.android.build.api.dsl.ManagedVirtualDevice) { ... } } groups { phoneAndTablet { targetDevices.add(devices.pixel2api29) targetDevices.add(devices.nexus9api30) } } } }
Kotlin
testOptions { managedDevices { devices { maybeCreate<com.android.build.api.dsl.ManagedVirtualDevice>("pixel2api29").apply { ... } maybeCreate<com.android.build.api.dsl.ManagedVirtualDevice>("nexus9api30").apply { ... } } groups { maybeCreate("phoneAndTablet").apply { targetDevices.add(devices["pixel2api29"]) targetDevices.add(devices["nexus9api30"]) } } } }
Gradle で管理されている一連のデバイスを使用してテストを実行するには、次のコマンドを使用します。
gradlew group-nameGroupBuildVariantAndroidTest
自動テストデバイスを使用してテストを実行する
Gradle で管理されているデバイスは、自動テストデバイス(ATD)と呼ばれる新しいタイプのエミュレータ デバイスに対応しています。これは、インストルメンテーション テストの実行時に CPU リソースとメモリリソースを削減するように最適化されています。ATD は、次のような方法で実行時のパフォーマンスを改善します。
- 一般的にはアプリのテストに役立たないプリインストールされているアプリを削除する
- 一般的にはアプリのテストに役立たない特定のバックグラウンド サービスを無効化する
- ハードウェア レンダリングを無効化する
開始する前に、Android Emulator をアップデートして、利用可能な最新バージョンにしてください。次に、build.gradle
を使って Gradle で管理されているデバイスを定義するときに、以下のように「-atd」イメージを指定します。
Groovy
android { testOptions { managedDevices { devices { pixel2api30 (com.android.build.api.dsl.ManagedVirtualDevice) { // Use device profiles you typically see in Android Studio. device = "Pixel 2" // ATDs currently support only API level 30. apiLevel = 30 // You can also specify "google-atd" if you require Google Play Services. systemImageSource = "aosp-atd" } } } } }
Kotlin
android { testOptions { managedDevices { devices { maybeCreate<com.android.build.api.dsl.ManagedVirtualDevice>("pixel2api30").apply { // Use device profiles you typically see in Android Studio. device = "Pixel 2" // ATDs currently support only API level 30. apiLevel = 30 // You can also specify "google-atd" if you require Google Play Services. systemImageSource = "aosp-atd" } } } } }
Gradle で管理されている他のデバイスと同様に、デバイス グループを作成することもできます。パフォーマンスをさらに向上させるには、テストのシャーディングで ATD を使用して、テストスイートの合計テスト実行時間を短縮することもできます。
ATD イメージから削除されるもの
ATD は、ヘッドレス モードで動作するだけでなく、アプリのコードのテストに通常は不要なアプリとサービスを削除または無効化してパフォーマンスを最適化します。以下の表に、ATD イメージで削除または無効化したコンポーネントの概要と、それらが有用でない理由を示します。
ATD 画像内で削除されるもの | 自動テストを実行するときにこれを必要としない理由 |
---|---|
Google サービスのアプリ:
|
自動テストでは、他のアプリまたはプラットフォームが正しく機能していると仮定して、対象アプリのロジックのテストに専念できます。 Espresso-Intents を使用すれば、送信されるインテントのマッチングや検証を行えるうえ、実際のインテント レスポンスの代わりにスタブ レスポンスを使うこともできます。 |
アプリとサービスの設定:
|
これらのアプリは、エンドユーザーがプラットフォーム設定の変更、デバイスのセットアップ、デバイス ストレージの管理を行うための GUI を提供します。これは通常、アプリレベルの自動テストの対象外です。
|
SystemUI | 自動テストでは、他のアプリまたはプラットフォームが正しく機能していると仮定して、対象アプリのロジックのテストに専念できます。 |
AOSP アプリとサービス:
|
これらのアプリとサービスは、通常、アプリのコードの自動テストの対象外です。 |
テストのシャーディングを有効にする
Gradle で管理されるデバイスはテストのシャーディングをサポートしているため、並列して実行される「シャード」という多数の同じ仮想デバイス インスタンスにテストスイートを分割して実行できます。テストのシャーディングを使用すると、追加のコンピューティング リソースを消費することになりますが、全体的なテスト実行時間は短縮できます。
特定のテスト実行中に使用するシャードの数を設定するには、gradle.properties
ファイルで次のように設定します。
android.experimental.androidTest.numManagedDeviceShards=<number_of_shards>
このオプションを使用してテストを実行する場合、Gradle で管理されているデバイスは、テストを実行する際、各デバイス プロファイルに指定したシャード数をプロビジョニングします。たとえば、テストを 3 つのデバイスで構成されるデバイス グループにデプロイし、numManagedDeviceShards
を 2 つに設定した場合、Gradle で管理されているデバイスは、テストを実行するために合計 6 つの仮想デバイスをプロビジョニングします。
テストが完了すると、テスト実行中に使用されるシャードごとに、Gradle からテスト結果が .proto
ファイルに出力されます。