Multiprocess Espresso

A medida que la app crece, tal vez te resulte útil colocar algunos de sus componentes en un proceso diferente del proceso principal de tu app. Para probar los componentes de la app en estas 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 hacer lo siguiente: probar sin problemas las interacciones de la IU de tu app que cruzan los procesos de tu app límites y, al mismo tiempo, mantiene las garantías de sincronización de Espresso.

Cuando uses Multiprocess Espresso, conserva los siguientes permisos y control de versiones consideraciones en mente:

  • 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 procesos dentro de paquete de tu 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.6.1'
}

Kotlin

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

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 deseas que pruebe todos los procesos del paquete de tu app. Si quieres probar solo un subconjunto de tus procesos de la app, puedes especificar una lista separada por comas dentro del targetProcesses en su lugar:

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

Cómo comprender la arquitectura de la herramienta

Cuando pruebes tu app e inicies su proceso predeterminado, podrás crear una IU interacción, como presionar un botón, que inicia una actividad en una actividad el proceso de administración de recursos. Luego, el sistema completa los siguientes pasos para habilitar el proceso cruzado. con Espresso:

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

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

Figura 1: Establecer una comunicación entre varios procesos de instrumentación con Multiprocess Espresso

Recursos adicionales

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