随着应用的不断发展,您可能会发现将某些应用组件放置在应用主进程之外的其他进程中很有用。如需测试这些非默认进程中的应用组件,您可以使用多进程 Espresso 的功能。此工具适用于 Android 8.0(API 级别 26)及更高版本,可让您在跨应用进程边界测试应用的界面交互时,仍能保持 Espresso 的同步保证。
使用多进程 Espresso 时,请注意以下版本和范围注意事项:
- 您的应用必须以 Android 8.0 (API 级别 26) 或更高版本为目标。
- 此工具只能测试您包含在应用软件包内的进程中的应用组件。它无法测试外部进程。
使用此工具
如需使用多进程 Espresso 测试应用中的进程,请在应用的 build.gradle
文件中添加对 espresso-remote 工件的引用:
app/build.gradle
Groovy
dependencies { ... androidTestImplementation 'androidx.test.espresso:espresso-remote:3.6.1' }
Kotlin
dependencies { ... androidTestImplementation('androidx.test.espresso:espresso-remote:3.6.1') }
您还需要将以下内容添加到应用的 androidTest
清单文件中:
- 定义进程的
<instrumentation>
元素。 - 一个
<meta-data>
元素,表示您要使用多进程 Espresso。
以下代码段展示了如何添加这些元素:
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 交互(例如按下按钮),从而在辅助进程中启动一个 activity。然后,系统会完成以下步骤以使用 Espresso 启用跨进程测试:
- Android 框架会创建并启动一个新进程,以遵循应用导航结构。每个
Instrumentation
进程都包含一个AndroidJUnitRunner
的新实例。在此阶段,这两个 instrumentation 进程无法相互通信。 - 每个
AndroidJUnitRunner
实例都会将 Espresso 注册为自己的测试框架。 - 两个
AndroidJUnitRunner
实例执行握手以建立相互之间的连接。同时,每个AndroidJUnitRunner
实例会将所有已注册的客户端(例如 Espresso)连接到其在其他进程中的对应客户端,以便这些客户端之间可以形成直接的通信通道。 - 每个
AndroidJUnitRunner
实例会继续寻找新添加的 instrumentation 实例和测试框架客户端,并根据需要建立额外的通信通道。
图 1 展示了此过程的结果:

其他资源
如需了解此主题的更多信息,请查阅以下资源。
- 使用 Android 测试支持库在 Android 上进行测试驱动开发 视频,Google I/O 2017 大会,从 36:41 开始。