アプリが成長するにつれて、アプリ コンポーネントの一部をアプリのメインプロセス以外のプロセスに配置すると便利な場合があります。これらのデフォルト以外のプロセスでアプリ コンポーネントをテストするには、マルチプロセス Espresso の機能を使用できます。Android 8.0(API レベル 26)以降で利用可能なこのツールを使うと、Espresso の同期を保証しながら、アプリのプロセス境界を越えるアプリの UI インタラクションをシームレスにテストできます。
マルチプロセス Espresso を使用する場合は、次のバージョニングとスコープに関する考慮事項に留意してください。
- アプリの対象 OS は、Android 8.0(API レベル 26)以上にする必要があります。
- このツールは、アプリのパッケージ内のプロセスに含まれるアプリ コンポーネントのみをテストできます。外部プロセスはテストできません。
ツールを使用する
マルチプロセス Espresso を使用してアプリ内のプロセスをテストするには、アプリの build.gradle
ファイルに espresso-remote アーティファクトへの参照を追加します。
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>
要素。
次のコード スニペットに、上記要素の追加方法を示します。
<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 に、この手順の結果を示します。
参考情報
このトピックに関するその他の情報については、次のリソースをご覧ください。
- Android Testing Support Library を使用した Android でのテスト主導開発のセッションの動画(Google I/O 2017、36:41 から)