マルチプロセス Espresso

アプリの規模が大きくなると、アプリのコンポーネントの一部をメインプロセス以外のプロセスに配置するほうが便利な場合が出てきます。このようなデフォルト以外のプロセスのアプリ コンポーネントをテストするには、マルチプロセス Espresso の機能を使用します。 このツール(Android 8.0、API レベル 26 以降で利用可能)を使用すると、Espresso の同期機能を維持しながら、アプリのプロセス境界をまたぐ UI 操作のテストを、その境界を意識せずに行えます。

マルチプロセス Espresso の使用にあたっては、バージョニングとスコープに関する以下の事項に留意してください。

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

ツールの使用

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

app/build.gradle

dependencies {
        ...
        androidTestImplementation 'androidx.test.espresso:espresso-remote:3.1.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 を使用した複数インストゥルメンテーション プロセス間の通信の確立

参考情報

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