Gradle で管理されているデバイスを使用したテストのスケーリング

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 サービスのアプリ:
  • メール
  • マップ
  • Chrome
  • メッセージ
  • Play ストア、その他
自動テストでは、他のアプリまたはプラットフォームが正しく機能していると仮定して、対象アプリのロジックのテストに専念できます。

Espresso-Intents を使用すれば、送信されるインテントのマッチングや検証を行えるうえ、実際のインテント レスポンスの代わりにスタブ レスポンスを使うこともできます。

アプリとサービスの設定:
  • CarrierConfig
  • EmergencyInfo
  • OneTimeInitializer
  • PhotoTable(スクリーン セーバー)
  • プロビジョニング
  • 設定アプリ
  • StorageManager
  • 電話 APN の構成
  • WallpaperCropper
  • WallpaperPicker
これらのアプリは、エンドユーザーがプラットフォーム設定の変更、デバイスのセットアップ、デバイス ストレージの管理を行うための GUI を提供します。これは通常、アプリレベルの自動テストの対象外です。


注: 設定プロバイダは ATD イメージで引き続き使用できます。

SystemUI 自動テストでは、他のアプリまたはプラットフォームが正しく機能していると仮定して、対象アプリのロジックのテストに専念できます。
AOSP アプリとサービス:
  • Browser2
  • カレンダー
  • Camera2
  • 連絡先
  • 電話アプリ
  • DeskClock
  • Gallery2
  • LatinIME
  • Launcher3QuickStep
  • 音楽
  • QuickSearchBox
  • SettingsIntelligence
これらのアプリとサービスは、通常、アプリのコードの自動テストの対象外です。

テストのシャーディングを有効にする

Gradle で管理されるデバイスはテストのシャーディングをサポートしているため、並列して実行される「シャード」という多数の同じ仮想デバイス インスタンスにテストスイートを分割して実行できます。テストのシャーディングを使用すると、追加のコンピューティング リソースを消費することになりますが、全体的なテスト実行時間は短縮できます。

特定のテスト実行中に使用するシャードの数を設定するには、gradle.properties ファイルで次のように設定します。

android.experimental.androidTest.numManagedDeviceShards=<number_of_shards>

このオプションを使用してテストを実行する場合、Gradle で管理されているデバイスは、テストを実行する際、各デバイス プロファイルに指定したシャード数をプロビジョニングします。たとえば、テストを 3 つのデバイスで構成されるデバイス グループにデプロイし、numManagedDeviceShards を 2 つに設定した場合、Gradle で管理されているデバイスは、テストを実行するために合計 6 つの仮想デバイスをプロビジョニングします。

テストが完了すると、テスト実行中に使用されるシャードごとに、Gradle からテスト結果が .proto ファイルに出力されます。