アプリの規模が大きくなると、アプリのコンポーネントの一部をメインプロセス以外のプロセスに配置するほうが便利な場合が出てきます。このようなデフォルト以外のプロセスのアプリ コンポーネントをテストするには、マルチプロセス 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 を使用したプロセス間テストが可能になります。
- Android フレームワークにより、アプリのナビゲーション構造に応じて新しいプロセスが作成、開始されます。各
Instrumentation
プロセスには、新しいAndroidJUnitRunner
インスタンスが含まれます。 この段階では、2 つのインストゥルメンテーション プロセスは相互に通信できません。 - 各
AndroidJUnitRunner
インスタンスにより、Espresso がテスト フレームワークとして登録されます。 AndroidJUnitRunner
の 2 つのインスタンスによる handshake が行われ、相互の接続が確立します。同時に、個々のAndroidJUnitRunner
インスタンスによって、Espresso などのすべての登録クライアントが他プロセスの対応するクライアントにそれぞれ接続され、クライアント間で直接の通信チャネルを形成できるようになります。- その後も、インストゥルメンテーション インスタンスやテスト フレームワーク クライアントが追加されると、各
AndroidJUnitRunner
インスタンスによって検出され、必要に応じて新たな通信チャネルが確立されます。
図 1 に、この手順の結果を示します。

参考情報
このトピックに関するその他の情報については、次のリソースをご覧ください。
- Google I/O 2017 の Android Testing Support Library を使用した Android でのテスト主導型開発のセッション動画(36:41 から開始)