La clase AndroidJUnitRunner
es un ejecutor de pruebas de JUnit que te permite ejecutar pruebas instrumentadas de JUnit 4 en dispositivos Android, incluidos los que usan frameworks de prueba de Espresso, UI Automator y Compose.
El ejecutor de pruebas controla la carga de tu paquete de pruebas y la app a prueba en un dispositivo, ejecuta tus pruebas e informa los resultados.
Este panel de prueba admite varias tareas de prueba comunes, entre otras:
- Escritura de pruebas de JUnit
- Cómo acceder al contexto de la app
- Filtrado de pruebas
- Fragmentación de pruebas
Cómo escribir pruebas JUnit
En el siguiente fragmento de código, se muestra cómo escribir una prueba JUnit 4 instrumentada para validar que la operación changeText
en la clase ChangeTextBehavior
funcione correctamente:
Kotlin
@RunWith(AndroidJUnit4::class) // Only needed when mixing JUnit 3 and 4 tests @LargeTest // Optional runner annotation class ChangeTextBehaviorTest { val stringToBeTyped = "Espresso" // ActivityTestRule accesses context through the runner @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) // Only needed when mixing JUnit 3 and 4 tests @LargeTest // Optional runner annotation 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))); } }
Accede al contexto de la aplicación
Cuando usas AndroidJUnitRunner
para ejecutar las pruebas, puedes acceder al contexto de la app que estás probando si llamas 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 APIs de prueba de bajo nivel con la clase InstrumentationRegistry
. Esta clase incluye el objeto Instrumentation
, el objeto Context
de la app de destino, el objeto Context
de la app de prueba y los argumentos de línea de comandos que se pasaron a tu prueba.
Pruebas de 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 código estándar y condicional a tus pruebas. Además de las anotaciones estándar compatibles con JUnit 4, el ejecutor de pruebas también admite anotaciones específicas de Android, incluidas las siguientes:
@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 impedir que se ejecuten pruebas en todos los niveles de API inferiores a 23, usa la anotación@SDKSuppress(minSdkVersion=23)
.@SmallTest
,@MediumTest
y@LargeTest
: Clasifican cuánto tiempo debería tardar en ejecutarse una prueba y, por lo tanto, con qué frecuencia puedes ejecutarla. Puedes usar esta anotación para filtrar qué pruebas ejecutar y configurar la propiedadandroid.testInstrumentationRunnerArguments.size
:
-Pandroid.testInstrumentationRunnerArguments.size=small
Pruebas de fragmentos
Si necesitas paralelizar la ejecución de tus pruebas y compartirlas en
varios servidores para que se ejecuten más rápido, puedes dividirlas en grupos o
fragmentos. El ejecutor de pruebas admite la división de un solo conjunto de pruebas en varios
fragmentos, de modo que puedas ejecutar con facilidad pruebas que pertenezcan al mismo fragmento como un
grupo. Cada fragmento se identifica con un número de índice. Cuando ejecutes pruebas, usa la opción -e numShards
para especificar la cantidad de fragmentos separados que se crearán y la opción -e shardIndex
para especificar el fragmento que se ejecutará.
Por ejemplo, para dividir el conjunto de pruebas en 10 fragmentos y ejecutar solo las pruebas agrupadas en el segundo fragmento, usa el siguiente comando adb:
adb shell am instrument -w -e numShards 10 -e shardIndex 2
Cómo usar Android Test Orchestrator
Android Test Orchestrator te permite ejecutar cada una de las pruebas de la app dentro de su propia invocación de Instrumentation
. Cuando usas AndroidJUnitRunner versión 1.0 o una versión posterior, tienes acceso a Android Test Orchestrator.
Android Test Orchestrator ofrece los siguientes beneficios para tu entorno de pruebas:
- 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, se quitará la mayor parte de ese estado compartido de la CPU o la memoria del dispositivo después de cada prueba. Para quitar todo el estado compartido de la CPU y la memoria del dispositivo después de cada prueba, usa la marcaclearPackageData
. Consulta la sección Cómo habilitar funciones desde Gradle para ver un ejemplo. - Las fallas se aíslan: Incluso si falla una prueba, solo elimina su propia instancia de
Instrumentation
. Esto significa que las otras pruebas del paquete se seguirán ejecutando y proporcionan resultados completos.
Este aislamiento genera un posible aumento en el tiempo de ejecución de la prueba, ya que Android Test Orchestrator reinicia la aplicación después de cada prueba.
Tanto Android Studio como Firebase Test Lab tienen Android Test Orchestrator preinstalado, aunque debes habilitar la función en Android Studio.
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:
- Paso 1: Modifica el archivo de Gradle. Agrega las siguientes declaraciones al archivo
build.gradle
de tu 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'
}
- Paso 2: Ejecuta el siguiente comando para ejecutar Android Test Orchestrator:
./gradlew connectedCheck
Cómo habilitar Android Test Orchestrator desde Android Studio
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:
DEVICE_API_LEVEL=$(adb shell getprop ro.build.version.sdk)
FORCE_QUERYABLE_OPTION=""
if [[ $DEVICE_API_LEVEL -ge 30 ]]; then
FORCE_QUERYABLE_OPTION="--force-queryable"
fi
# uninstall old versions
adb uninstall androidx.test.services
adb uninstall androidx.test.orchestrator
# Install the test orchestrator.
adb install $FORCE_QUERYABLE_OPTION -r path/to/m2repository/androidx/test/orchestrator/1.4.2/orchestrator-1.4.2.apk
# Install test services.
adb install $FORCE_QUERYABLE_OPTION -r path/to/m2repository/androidx/test/services/test-services/1.4.2/test-services-1.4.2.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/.AndroidTestOrchestrator'
Como se muestra en la sintaxis del comando, instala Android Test Orchestrator y, luego, úsalo directamente.
adb shell pm list instrumentation
Usa diferentes cadenas de herramientas
Si usas una cadena de herramientas diferente para probar la app, puedes seguir usando Android Test Orchestrator. Para ello, completa los siguientes pasos:
- Incluye los paquetes necesarios en el archivo de compilación de tu app.
- Habilita Android Test Orchestrator desde la línea de comandos.
Arquitectura
El APK del servicio Orchestrator se almacena en un proceso independiente del APK de prueba y del APK de la app que se está probando:
![Orchestrator te permite controlar las pruebas JUnit.](https://developer.android.com/static/training/testing/instrumented-tests/androidx-test-libraries/orchestrator.png?authuser=5&hl=es)
Android Test Orchestrator recopila pruebas JUnit al comienzo de la ejecución del paquete de pruebas, pero luego ejecuta cada prueba por separado, en su propia instancia de Instrumentation
.
Más información
Si deseas obtener más información para usar AndroidJUnitRunner, consulta la referencia de la API.
Recursos adicionales
Para obtener más información sobre el uso de AndroidJUnitRunner
, consulta los siguientes recursos.
Ejemplos
- AndroidJunitRunnerSample: Anotaciones de prueba, pruebas parametrizadas y creación de conjuntos de pruebas.