Usa la API de Espresso Device para probar tu app cuando el dispositivo experimente cambios de configuración comunes, como la rotación y el despliegue de la pantalla. La API de Espresso Device es la herramienta recomendada para realizar acciones a nivel del dispositivo junto con tus reglas de prueba de Jetpack Compose. Si es la primera vez que escribes pruebas de IU para Jetpack Compose, consulta Cómo probar tu diseño de Compose.
La API de Espresso Device te permite activar cambios de configuración en un dispositivo virtual y ejecutar tus pruebas de forma síncrona, de modo que solo se produzca una acción o aserción de IU a la vez y los resultados de las pruebas sean más confiables. Si no tienes experiencia en la escritura de pruebas de IU con Espresso, consulta su documentación.
Para usar la API de Espresso Device, necesitas lo siguiente:
- Android Studio Iguana o versiones posteriores
- Complemento de Android para Gradle 8.3 o una versión posterior
- Android Emulator 33.1.10 o versiones posteriores
- Un dispositivo virtual Android que ejecute el nivel de API 24 o uno posterior
Configura tu proyecto para la API de Espresso Device
Para configurar tu proyecto de modo que admita la API de Espresso Device, haz lo siguiente:
Para permitir que la prueba pase comandos al dispositivo de prueba, agrega los permisos de red necesarios al archivo de manifiesto en el conjunto de orígenes
androidTest:<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />Si tu prueba se orienta a Android 17 (nivel de API 37) o versiones posteriores, también debes declarar el permiso
ACCESS_LOCAL_NETWORK:<uses-permission android:name="android.permission.ACCESS_LOCAL_NETWORK" />Habilita la marca experimental
enableEmulatorControlen el archivogradle.properties:android.experimental.androidTest.enableEmulatorControl=trueHabilita la opción
emulatorControlen la secuencia de comandos de compilación a nivel del módulo:Kotlin
testOptions { emulatorControl { enable = true } }
Groovy
testOptions { emulatorControl { enable = true } }
En la secuencia de comandos de compilación a nivel de módulo, importa la biblioteca de Espresso Device a tu proyecto:
Kotlin
dependencies { androidTestImplementation("androidx.test.espresso:espresso-device:1.1.0") }
Groovy
dependencies { androidTestImplementation 'androidx.test.espresso:espresso-device:1.1.0' }
Prueba los cambios de configuración comunes
La API de Espresso Device tiene varios estados de orientación de la pantalla y plegado que puedes usar para activar cambios en la configuración del dispositivo. En los siguientes ejemplos, se muestra cómo activar estos estados del dispositivo y verificar los cambios resultantes en la IU con las reglas de prueba de Compose.
Prueba la rotación de pantalla
Para probar la rotación de pantalla, puedes usar la clase ScreenOrientationRule para definir la orientación del dispositivo durante la prueba.
Este es un ejemplo de cómo probar qué sucede con tu app cuando rota la pantalla del dispositivo:
Primero, define tu regla de prueba de Compose y usa la clase
ScreenOrientationRulepara establecer el dispositivo en un estado inicial coherente (como el modo de retrato):import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertDoesNotExist import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithTag import androidx.test.espresso.device.EspressoDevice.onDevice import androidx.test.espresso.device.action.ScreenOrientation import androidx.test.espresso.device.rules.ScreenOrientationRule import org.junit.Rule import org.junit.Test class MyConfigurationTest { // 1. Define the Compose test rule @get:Rule val composeTestRule = createComposeRule() // 2. Define the Espresso Device rule for a consistent starting state @get:Rule val screenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT) }Si tu prueba se segmenta para Android 17 (nivel de API 37) o versiones posteriores, la API de Espresso Device requiere el permiso
ACCESS_LOCAL_NETWORK. Debes asegurarte de que se otorgue este permiso antes de que se ejecute la reglaScreenOrientationRule. UsaRuleChainde JUnit para ejecutar primero la reglaGrantPermissionRule:import androidx.test.rule.GrantPermissionRule import org.junit.rules.RuleChain class MyConfigurationTest { val grantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.ACCESS_LOCAL_NETWORK) val composeTestRule = createComposeRule() val screenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT) @get:Rule val chain = RuleChain .outerRule(grantPermissionRule) .around(composeTestRule) .around(screenOrientationRule) }Crea una prueba que configure el dispositivo en orientación horizontal durante la ejecución de la prueba:
@Test fun myRotationTest() { ... // Sets the device to landscape orientation during test execution. onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE) ... }Después de que la pantalla rote, usa
composeTestRulepara verificar que tus elementos componibles se adapten al nuevo estado según lo esperado.@Test fun myRotationTest() { ... // Sets the device to landscape orientation during test execution. onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE) composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed() composeTestRule.onNodeWithTag("BottomBar").assertDoesNotExist() }
Prueba el despliegue de la pantalla
A continuación, se muestra un ejemplo de cómo probar qué sucede con tu app si se encuentra en un dispositivo plegable y se despliega la pantalla:
Primero, prueba con el dispositivo en estado plegado llamando a
onDevice().setClosedMode(). Asegúrate de que tus elementos componibles se adapten al ancho de pantalla compacto.@Test fun myUnfoldedTest() { onDevice().setClosedMode() composeTestRule.onNodeWithTag("BottomBar").assertIsDisplayed() composeTestRule.onNodeWithTag("NavRail").assertDoesNotExist() ... }Para realizar la transición a un estado completamente desplegado, llama a
onDevice().setFlatMode(). Comprueba que los elementos componibles se adapten a la clase de tamaño expandida.@Test fun myUnfoldedTest() { onDevice().setClosedMode() ... onDevice().setFlatMode() composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed() composeTestRule.onNodeWithTag("BottomBar").assertDoesNotExist() }
Especifica qué dispositivos necesitan tus pruebas
Si ejecutas una prueba que realiza acciones de plegado en un dispositivo que no es plegable, es probable que la prueba falle. Para ejecutar solo las pruebas pertinentes para el dispositivo en ejecución, usa la anotación @RequiresDeviceMode. El ejecutor de pruebas omite automáticamente la ejecución de pruebas en dispositivos que no admiten la configuración que se está probando. Puedes agregar la regla de requisitos del dispositivo a cada prueba o a una clase de prueba completa.
Por ejemplo, para especificar que una prueba solo se debe ejecutar en dispositivos que admiten el despliegue a una configuración plana, agrega el siguiente código @RequiresDeviceMode a tu prueba:
@Test
@RequiresDeviceMode(mode = FLAT)
fun myUnfoldedTest() {
...
}