Multiprocess Espresso

随着应用的扩展,您可能会发现,将某些应用组件置于应用主进程以外的其他进程中很有用。如需在这些非默认进程中测试应用组件,您可以使用 Multiprocess Espresso 的功能。此工具在 Android 8.0(API 级别 26)及更高版本上可用,可让您跨应用的进程边界无缝测试应用的界面交互,同时保持 Espresso 的同步保证。

使用 Multiprocess Espresso 时,在版本控制和范围方面应记住以下几点:

  • 您的应用必须以 Android 8.0(API 级别 26)或更高版本为目标平台。
  • 该工具只能测试您在应用软件包内的进程中添加的应用组件。它无法测试外部进程。

使用该工具

如需使用 Multiprocess Espresso 测试应用内的进程,请在应用的 build.gradle 文件中添加对 espresso-remote 工件的引用:

app/build.gradle

dependencies {
        ...
        androidTestImplementation 'androidx.test.espresso:espresso-remote:3.1.0'
    }
    

您还需要将以下内容添加到应用的 androidTest 清单中:

  • 用于定义进程的 <instrumentation> 元素。
  • 指明您要使用 Multiprocess 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" ... />
    

了解该工具的架构

当您测试应用并启动其默认进程时,您执行的界面交互(如按某个按钮)可能会在次进程中启动 Activity。系统随后会完成以下步骤以使用 Espresso 启用跨进程测试:

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

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

图 1. 使用 Multiprocess Espresso 在多个插桩测试进程之间建立通信

其他资源

如需详细了解本主题,请参阅以下资源。