マルチプロセス Espresso

アプリが成長するにつれて、アプリ コンポーネントの一部をアプリのメインプロセス以外のプロセスに配置すると便利な場合があります。これらのデフォルト以外のプロセスでアプリ コンポーネントをテストするには、マルチプロセス Espresso の機能を使用できます。Android 8.0(API レベル 26)以降で利用可能なこのツールを使うと、Espresso の同期を保証しながら、アプリのプロセス境界を越えるアプリの UI インタラクションをシームレスにテストできます。

マルチプロセス Espresso を使用する場合は、次のバージョニングとスコープに関する考慮事項に留意してください。

  • アプリの対象 OS は、Android 8.0(API レベル 26)以上にする必要があります。
  • このツールは、アプリのパッケージ内のプロセスに含まれるアプリ コンポーネントのみをテストできます。外部プロセスはテストできません。

ツールを使用する

マルチプロセス Espresso を使用してアプリ内のプロセスをテストするには、アプリの build.gradle ファイルに espresso-remote アーティファクトへの参照を追加します。

app/build.gradle

Groovy

dependencies {
    ...
    androidTestImplementation 'androidx.test.espresso:espresso-remote:3.4.0'
}

Kotlin

dependencies {
    ...
    androidTestImplementation('androidx.test.espresso:espresso-remote:3.4.0')
}

また、アプリの androidTest マニフェストに以下を追加する必要があります。

  • プロセスを定義する <instrumentation> 要素。
  • マルチプロセス Espresso を使用することを示す <meta-data> 要素。

次のコード スニペットに、上記要素の追加方法を示します。

src/androidTest/AndroidManifest.xml

<manifest ... package="androidx.test.mytestapp.tests">
  <uses-sdk android:targetSdkVersion="27" android:minSdkVersion="14" />
  <instrumentation
    android:name="androidx.test.runner.AndroidJUnitRunner"
    android:targetPackage="androidx.test.mytestapp"
    android:targetProcesses="*">
    <meta-data
      android:name="remoteMethod"
      android:value="androidx.test.espresso.remote.EspressoRemote#remoteInit" />
  </instrumentation>
</manifest>

上のスニペットは、アプリのパッケージ内のすべてのプロセスをテストするよう Android フレームワークに指示しています。アプリのプロセスのサブセットのみをテストする場合は、代わりに targetProcesses 要素内にカンマ区切りのリストを指定できます。

<instrumentation
    ...
    android:targetProcesses=
            "androidx.test.mytestapp:myFirstAppProcessToTest,
             androidx.test.mytestapp:mySecondAppProcessToTest" ... />

ツールのアーキテクチャについて

アプリをテストしてデフォルト プロセスを起動するときに、セカンダリ プロセスでアクティビティを開始する UI 操作(ボタンの押下など)が必要になることがあります。その後、システムは次のステップを完了して、Espresso を使用したクロスプロセス テストを有効にします。

  1. Android フレームワークは、アプリのナビゲーション構造に従う新しいプロセスを作成して開始します。各 Instrumentation プロセスには、AndroidJUnitRunner の新しいインスタンスが含まれます。この段階では、2 つのインストルメンテーション プロセスは相互に通信できません。
  2. AndroidJUnitRunner インスタンスは、Espresso をテスト フレームワークとして登録します。
  3. AndroidJUnitRunner の 2 つのインスタンスが handshake を実行して、相互に接続を確立します。同時に、各 AndroidJUnitRunner インスタンスは、Espresso などの登録済みのすべてのクライアントを他のプロセスの対応するクライアントに接続し、クライアント間で直接通信チャネルを形成できるようにします。
  4. AndroidJUnitRunner インスタンスは、新しく追加されたインストルメンテーション インスタンスとテスト フレームワーク クライアントを探し、必要に応じて追加の通信チャネルを確立します。

図 1 に、この手順の結果を示します。

図 1. マルチプロセス Espresso を使用して複数のインストルメンテーション プロセス間の通信を確立する

参考情報

このトピックに関するその他の情報については、次のリソースをご覧ください。