Multiprocess Espresso

A medida que tu app se expanda, tal vez te resulte útil colocar algunos de sus componentes en un proceso diferente del principal. Para probar los componentes de la app en estos procesos no predeterminados, puedes usar la funcionalidad de Multiprocess Espresso. Esta herramienta, disponible en Android 8.0 (nivel de API 26) y versiones posteriores, te permite probar sin problemas las interacciones de la IU de tu app que cruzan los límites del proceso de tu app y, al mismo tiempo, mantener las garantías de sincronización de Espresso.

Cuando uses Multiprocess Espresso, ten en cuenta las siguientes consideraciones sobre el control de versiones y el alcance:

  • Tu app debe apuntar a Android 8.0 (API nivel 26) o una versión posterior.
  • La herramienta solo puede probar los componentes de la app que incluyas en los procesos dentro del paquete de la app. No puedes probar los procesos externos.

Cómo usar la herramienta

Para probar un proceso en tu app con Multiprocess Espresso, agrega una referencia al artefacto espresso-remote en el archivo build.gradle de tu app:

app/build.gradle

Groovy

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

Kotlin

dependencies {
    ...
    androidTestImplementation('androidx.test.espresso:espresso-remote:3.4.0')
}

También debes agregar lo siguiente al manifiesto androidTest de tu app:

  • Un elemento <instrumentation> que define el proceso.
  • Un elemento <meta-data> que indica que deseas usar Multiprocess Espresso.

En el siguiente fragmento de código, se muestra cómo agregar estos elementos:

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>

El fragmento anterior le indica al framework de Android que quieres que pruebe todos los procesos del paquete de tu app. Si solo quieres probar un subconjunto de los procesos de la app, puedes especificar una lista separada por comas dentro del elemento targetProcesses:

<instrumentation
    ...
    android:targetProcesses=
            "androidx.test.mytestapp:myFirstAppProcessToTest,
             androidx.test.mytestapp:mySecondAppProcessToTest" ... />

Cómo comprender la arquitectura de la herramienta

Cuando pruebas tu app e inicias su proceso predeterminado, puedes realizar una interacción de la IU, como presionar un botón, que inicia una actividad en un proceso secundario. Luego, el sistema completa los siguientes pasos para habilitar las pruebas de proceso cruzado usando Espresso:

  1. El framework de Android crea e inicia un nuevo proceso para seguir la estructura de navegación de tu app. Cada proceso Instrumentation incluye una instancia nueva de AndroidJUnitRunner. En esta etapa, los 2 procesos de instrumentación no se pueden comunicar entre sí.
  2. Cada instancia de AndroidJUnitRunner registra Espresso como su framework de prueba.
  3. Las 2 instancias de AndroidJUnitRunner realizan un protocolo de enlace para establecer una conexión entre ellas. Al mismo tiempo, cada instancia de AndroidJUnitRunner conecta a todos los clientes registrados, como Espresso, con sus contrapartes respectivas en otros procesos para que estos clientes puedan formar un canal de comunicación directo entre ellos.
  4. Cada instancia de AndroidJUnitRunner continúa buscando instancias de instrumentación y clientes de framework de prueba recientemente agregados, estableciendo canales de comunicación adicionales según sea necesario.

En la figura 1, se muestra el resultado de este proceso:

Figura 1. Cómo establecer la comunicación entre varios procesos de instrumentación mediante Multiprocess Espresso

Recursos adicionales

Para obtener más información sobre este tema, consulta los siguientes recursos.