Espresso Device API を使用して画面構成の変更をテストする

Espresso Device API を使用して、デバイスで一般的な構成変更(回転や画面の展開など)が発生したときにアプリをテストします。Espresso Device API を使用すると、このような構成変更を仮想デバイスでシミュレートしてテストを同期的に実行できるため、一度に 1 つの UI アクションまたはアサーションしか実行されないため、テスト結果の信頼性が向上します。初めて Espresso を使用して UI テストを作成する場合は、そのドキュメントをご覧ください。

Espresso Device API を使用するには、次のものが必要です。

  • Android Studio Iguana 以降
  • Android Gradle プラグイン 8.3 以降
  • Android Emulator 33.1.10 以降
  • API レベル 24 以降を搭載した Android 仮想デバイス

Espresso Device API 用のプロジェクトをセットアップする

Espresso Device API をサポートするようにプロジェクトをセットアップする手順は次のとおりです。

  1. テストからテストデバイスにコマンドを渡すには、androidTest ソースセットのマニフェスト ファイルに INTERNET 権限と ACCESS_NETWORK_STATE 権限を追加します。

      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permissions.ACCESS_NETWORK_STATE" />
      
  2. gradle.properties ファイルで enableEmulatorControl 試験運用版フラグを有効にします。

      android.experimental.androidTest.enableEmulatorControl=true
      
  3. モジュール レベルのビルド スクリプトで emulatorControl オプションを有効にします。

    Kotlin

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      

    Groovy

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      
  4. モジュール レベルのビルド スクリプトで、Espresso デバイス ライブラリをプロジェクトにインポートします。

    Kotlin

      dependencies {
        androidTestImplementation("androidx.test.espresso:espresso-device:3.5.1")
      }
      

    Groovy

      dependencies {
        androidTestImplementation 'androidx.test.espresso:espresso-device:3.5.1'
      }
      

一般的な構成変更に対するテスト

Espresso Device API には複数の画面の向きと折りたたみ式状態があり、これらを使用してデバイス構成の変更をシミュレートできます。

画面の回転に対するテスト

デバイスの画面が回転したときにアプリがどのように動作するかをテストする方法の例を次に示します。

  1. まず、起動状態が一定になるように、デバイスを縦向きモードに設定します。

      import androidx.test.espresso.device.action.ScreenOrientation
      import androidx.test.espresso.device.rules.ScreenOrientationRule
      ...
      @get:Rule
      val screenOrientationRule: ScreenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT)
      
  2. テスト実行中にデバイスを横向きに設定するテストを作成します。

      @Test
      fun myRotationTest() {
        ...
        // Sets the device to landscape orientation during test execution.
        onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE)
        ...
      }
      
  3. 画面が回転したら、UI が想定どおりに新しいレイアウトに適応することを確認します。

      @Test
      fun myRotationTest() {
        ...
        // Sets the device to landscape orientation during test execution.
        onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE)
        composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed()
        composeTestRule.onNodeWithTag("BottomBar").assertDoesNotExist()
      }
      

画面の展開に対するテスト

以下に、アプリが折りたたみ式デバイス上にあるときに画面を開いた場合のアプリの動作をテストする方法の例を示します。

  1. まず、onDevice().setClosedMode() を呼び出して、折りたたみ状態のデバイスでテストします。アプリのレイアウトがコンパクト画面の幅に適応するようにします。

      @Test
      fun myUnfoldedTest() {
        onDevice().setClosedMode()
        composeTestRule.onNodeWithTag("BottomBar").assetIsDisplayed()
        composeTestRule.onNodeWithTag("NavRail").assetDoesNotExist()
        ...
      }
      
  2. 完全に展開された状態に移行するには、onDevice().setFlatMode() を呼び出します。アプリのレイアウトが拡張サイズクラスに適応していることを確認します。

      @Test
      fun myUnfoldedTest() {
        onDevice().setClosedMode()
        ...
        onDevice().setFlatMode()
        composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed()
        composeTestRule.onNodeWithTag("BottomBar").assetDoesNotExist()
      }
      

テストに必要なデバイスを指定する

折りたたみ式ではないデバイスで折りたたみアクションを実行するテストを実行すると、テストが失敗する可能性があります。実行中のデバイスに関連するテストのみを実行するには、@RequiresDeviceMode アノテーションを使用します。テストランナーは、テスト対象の構成をサポートしていないデバイスでのテスト実行を自動的にスキップします。デバイス要件ルールは、各テストまたはテストクラス全体に追加できます。

たとえば、フラット構成への展開をサポートするデバイスでのみテストを実行するように指定するには、次の @RequiresDeviceMode コードをテストに追加します。

@Test
@RequiresDeviceMode(mode = FLAT)
fun myUnfoldedTest() {
  ...
}