多进程 Espresso

随着您的应用不断发展,您可能发现将某些应用组件放在应用主进程以外的其他进程中非常有用。要测试这些 *非默认进程* 中的应用组件,您可以使用多进程 Espresso 的功能。此工具适用于 Android 8.0(API 级别 26)及更高版本,允许您在保持 Espresso 同步保证的同时,无缝测试应用跨越应用进程边界的 UI 交互。

使用多进程 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 交互(例如,按按钮),这会启动辅助进程中的活动。然后,系统将完成以下步骤,以使用 Espresso 启用跨进程测试

  1. Android 框架创建并启动一个新进程,以遵循应用的导航结构。每个 Instrumentation 进程都包含一个新的 AndroidJUnitRunner 实例。在此阶段,2 个仪器进程无法相互通信。
  2. 每个 AndroidJUnitRunner 实例将 Espresso 注册为其测试框架。
  3. 两个 AndroidJUnitRunner 实例执行握手操作以建立彼此之间的连接。 同时,每个 AndroidJUnitRunner 实例将所有注册的客户端(如 Espresso)与其在其他进程中的对应客户端连接起来,以便这些客户端能够在彼此之间形成直接的通信通道。
  4. 每个 AndroidJUnitRunner 实例继续查找新添加的 Instrumentation 实例和测试框架客户端,并根据需要建立额外的通信通道。

图 1 说明了此过程的结果。

图 1. 使用多进程 Espresso 在多个 Instrumentation 进程之间建立通信

其他资源

有关此主题的更多信息,请参考以下资源。