AndroidJUnitRunner

La clase AndroidJUnitRunner es un panel de prueba JUnit que te permite ejecutar las clases de prueba de estilo JUnit 3 o JUnit 4 en dispositivos Android, incluidos aquellos que usan los marcos de trabajo de prueba de Espresso y UI Automator.

El panel de prueba controla la carga del paquete de pruebas y la app de prueba en el dispositivo, ejecuta las pruebas e informa los resultados. Esta clase reemplaza la clase InstrumentationTestRunner, que solo admite las pruebas JUnit 3.

Este panel de prueba admite varias tareas de prueba comunes, entre otras:

Cómo escribir pruebas JUnit

El panel de prueba es compatible con tus pruebas Junit 3 y Junit 4 (hasta Junit 4.10). Sin embargo, debes evitar combinar código de prueba Junit 3 y Junit 4 en el mismo paquete, ya que esto puede ocasionar resultados inesperados. Si estás creando una clase de prueba instrumentada de JUnit 4 para ejecución en un dispositivo o emulador, debes agregar @RunWith(AndroidJUnit4.class) como prefijo a la clase de prueba.

En el siguiente fragmento de código, se muestra la manera en que puedes escribir una prueba JUnit 4 instrumentada para validar el funcionamiento correcto de la operación changeText en la clase ChangeTextBehavior:

Kotlin

    @RunWith(AndroidJUnit4::class)
    @LargeTest
    class ChangeTextBehaviorTest {
        val stringToBeTyped = "Espresso"
        @get:Rule
        val activityRule = ActivityTestRule(MainActivity::class.java)

        @Test fun changeText_sameActivity() {
            // Type text and then press the button.
            onView(withId(R.id.editTextUserInput))
                .perform(typeText(stringToBeTyped), closeSoftKeyboard())
            onView(withId(R.id.changeTextBt)).perform(click())

            // Check that the text was changed.
            onView(withId(R.id.textToBeChanged))
                .check(matches(withText(stringToBeTyped)))
        }
    }
    

Java

    @RunWith(AndroidJUnit4.class)
    @LargeTest
    public class ChangeTextBehaviorTest {

        private static final String stringToBeTyped = "Espresso";

        @Rule
        public ActivityTestRule<MainActivity> activityRule =
                new ActivityTestRule<>(MainActivity.class);

        @Test
        public void changeText_sameActivity() {
            // Type text and then press the button.
            onView(withId(R.id.editTextUserInput))
                    .perform(typeText(stringToBeTyped), closeSoftKeyboard());
            onView(withId(R.id.changeTextBt)).perform(click());

            // Check that the text was changed.
            onView(withId(R.id.textToBeChanged))
                    .check(matches(withText(stringToBeTyped)));
        }
    }
    

Usa Android Test Orchestrator

Cuando usas AndroidJUnitRunner versión 1.0 o una versión posterior, tienes acceso a una herramienta denominada Android Test Orchestrator, que te permite ejecutar cada una de las pruebas de la app dentro de su propia invocación de Instrumentation.

Android Test Orchestrator ofrece los siguientes beneficios para tu entorno de prueba:

  • Estado de uso compartido mínimo. Cada prueba se ejecuta en su propia instancia de Instrumentation. Por lo tanto, si las pruebas comparten el estado de la app, la mayor parte de ese estado compartido se quita de la CPU o la memoria del dispositivo después de cada prueba.

    Para quitar todo el estado de uso compartido de la CPU y la memoria del dispositivo después de cada prueba, usa la marca clearPackageData.

  • Se aíslan las fallas. Incluso si una prueba falla, solo elimina su propia instancia de Instrumentation, de modo que las demás pruebas del conjunto se siguen ejecutando.

Tanto Android Studio como Firebase Test Lab tienen Android Test Orchestrator preinstalado, aunque debes habilitar la función en Android Studio.

Sin embargo, si usas una cadena de herramientas diferente para probar la app, aún puedes usar Android Test Orchestrator completando los siguientes pasos:

  1. Incluye los paquetes necesarios en el archivo de compilación de la app.
  2. Habilita Android Test Orchestrator desde la línea de comandos.

Cómo habilitar Android Test Orchestrator desde Gradle

Para habilitar Android Test Orchestrator con la herramienta de línea de comandos de Gradle, completa estos pasos:

  1. Agrega las siguientes afirmaciones al archivo build.gradle del proyecto:

        android {
          defaultConfig {
           ...
           testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    
           // The following argument makes the Android Test Orchestrator run its
           // "pm clear" command after each test invocation. This command ensures
           // that the app's state is completely cleared between tests.
           testInstrumentationRunnerArguments clearPackageData: 'true'
         }
    
          testOptions {
            execution 'ANDROIDX_TEST_ORCHESTRATOR'
          }
        }
    
        dependencies {
          androidTestImplementation 'androidx.test:runner:1.1.0'
          androidTestUtil 'androidx.test:orchestrator:1.1.0'
        }
  2. Ejecuta Android Test Orchestrator ejecutando el siguiente comando:

        ./gradlew connectedCheck

Cómo habilitar Android Test Orchestrator desde Android Studio

La compatibilidad con Android Test Orchestrator está disponible para Android Studio 3.0 y versiones posteriores. Para habilitar Android Test Orchestrator en Android Studio, agrega las declaraciones que se muestran en Cómo habilitar Android Test Orchestrator desde Gradle al archivo build.gradle de la app.

Cómo habilitar Android Test Orchestrator desde la línea de comandos

Para usar Android Test Orchestrator en la línea de comandos, ejecuta los siguientes comandos en una ventana de terminal:

    # Install the test orchestrator.
    adb install -r path/to/m2repository/androidx/test/orchestrator/1.1.0/orchestrator-1.1.0.apk

    # Install test services.
    adb install -r path/to/m2repository/androidx/test/services/test-services/1.1.0/test-services-1.1.0.apk

    # Replace "com.example.test" with the name of the package containing your tests.
    # Add "-e clearPackageData true" to clear your app's data in between runs.
    adb shell 'CLASSPATH=$(pm path androidx.test.services) app_process / \
      androidx.test.services.shellexecutor.ShellMain am instrument -w -e \
      targetInstrumentation com.example.test/androidx.test.runner.AndroidJUnitRunner \
      androidx.test.orchestrator/.AndroidXTestOrchestrator'
    

Como se muestra en la sintaxis del comando, instala Android Test Orchestrator y luego úsalo directamente.

Nota: Si no conoces la instrumentación de destino, puedes buscarla ejecutando el siguiente comando:

    adb shell pm list instrumentation

Arquitectura

El APK del servicio Orchestrator se almacena en un proceso que es independiente del APK de prueba y del APK de la app que se está probando, como se muestra en la Figura 1:

Figura 1: Estructura del APK de Android Test Orchestrator

Android Test Orchestrator recopila pruebas JUnit al comienzo de la ejecución del conjunto de pruebas, pero luego ejecuta cada prueba por separado, en su propia instancia de Instrumentation.

Cómo acceder al contexto de la app

Para obtener el contexto de la app que estás probando, llama al método estático ApplicationProvider.getApplicationContext(). Si creaste una subclase personalizada de Application en tu app, este método muestra el contexto de la subclase personalizada.

Si eres un implementador de herramientas, puedes acceder a las API de prueba de nivel inferior utilizando la clase InstrumentationRegistry. Esta clase comprende el objeto Instrumentation, la app de destino Context, la app de prueba Context, y los argumentos de línea de comandos pasados a su prueba. Estos datos son útiles cuando escribes pruebas con el marco de trabajo de UI Automator o cuando tus pruebas dependen del contexto de la app.

Pruebas del filtro

En tus pruebas JUnit 4.x, puedes usar anotaciones para configurar la ejecución de la prueba. Esta función minimiza la necesidad de agregar un código estándar y condicional a tus pruebas. Además de las anotaciones estándares compatibles con Junit 4, el panel de pruebas también es compatible con anotaciones específicas de Android, entre otras:

  • @RequiresDevice: Especifica que la prueba se debe ejecutar solo en dispositivos físicos, no en emuladores.
  • @SdkSuppress: Impide que la prueba se ejecute en un nivel de API de Android inferior al nivel determinado. Por ejemplo, para suprimir las pruebas en todos los niveles de API inferiores a 23 desde la ejecución, usa la anotación @SDKSuppress(minSdkVersion=23).
  • @SmallTest, @MediumTest y @LargeTest: Clasifica cuánto tiempo demorará la ejecución de una prueba y, por lo tanto, con qué frecuencia podrás ejecutarla.

Pruebas de Shard

El panel de pruebas admite la división de un único conjunto de pruebas en varios shards, de modo que puedas ejecutar con facilidad las pruebas que pertenecen a un mismo shard como un grupo, en la misma instancia de Instrumentation. Cada shard se identifica con un número de índice. Al ejecutar pruebas, usa la opción -e numShards para especificar el número de shards separados que se crearán y la opción -e shardIndex para especificar qué shard se ejecutará.

Por ejemplo, para dividir el conjunto de pruebas en 10 shards y ejecutar solo las pruebas agrupadas en el segundo shard, usa el siguiente comando:

    adb shell am instrument -w -e numShards 10 -e shardIndex 2
    

Más información

Para obtener más información sobre cómo usar el panel de prueba, consulta la Referencia de API.

Para usar la clase AndroidJUnitRunner, inclúyela como uno de los paquetes de tu proyecto, como se describe en el proyecto de configuración para AndroidX Test.

Recursos adicionales

Para obtener más información sobre el uso de AndroidJUnitRunner, consulta los siguientes recursos.

Ejemplos