Cómo realizar pruebas con los cambios en la configuración de la pantalla con la API de Espresso Device

Usa la API de Espresso Device para probar tu app cuando el dispositivo se someta a cambios comunes de configuración, como la rotación y el desplegado de la pantalla. La API de Espresso Device te permite simular estos cambios de configuración en un dispositivo virtual y ejecuta las pruebas de forma síncrona, de modo que solo se produce una acción o aserción de la IU a la vez, y los resultados de la prueba son más confiables. Si es la primera vez que escribes 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.
  • Dispositivo virtual de Android que ejecute el nivel de API 24 o uno posterior

Cómo configurar tu proyecto para la API de Espresso Device

Para configurar tu proyecto de modo que sea compatible con la API de Espresso Device, haz lo siguiente:

  1. Para permitir que la prueba pase los comandos al dispositivo de prueba, agrega los permisos INTERNET y ACCESS_NETWORK_STATE al archivo de manifiesto en el conjunto de orígenes androidTest:

      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permissions.ACCESS_NETWORK_STATE" />
      
  2. Habilita la marca experimental enableEmulatorControl en el archivo gradle.properties:

      android.experimental.androidTest.enableEmulatorControl=true
      
  3. Habilita la opción emulatorControl en la secuencia de comandos de compilación a nivel de módulo:

    Kotlin

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      

    Groovy

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      
  4. En la secuencia de comandos de compilación a nivel del módulo, importa la biblioteca de dispositivos Espresso a tu proyecto:

    Kotlin

      dependencies {
        androidTestImplementation("androidx.test.espresso:espresso-device:3.5.1")
      }
      

    Groovy

      dependencies {
        androidTestImplementation 'androidx.test.espresso:espresso-device:3.5.1'
      }
      

Cómo realizar pruebas con cambios de configuración comunes

La API de Espresso Device tiene varias orientaciones de pantalla y estados plegables que puedes usar para simular cambios en la configuración del dispositivo.

Prueba la rotación de pantalla

A continuación, te mostramos un ejemplo de cómo probar lo que le sucede a tu app cuando gira la pantalla del dispositivo:

  1. Primero, para lograr un estado de inicio coherente, establece el dispositivo en modo vertical:

      import androidx.test.espresso.device.action.ScreenOrientation
      import androidx.test.espresso.device.rules.ScreenOrientationRule
      ...
      @get:Rule
      val screenOrientationRule: ScreenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT)
      
  2. Crea una prueba que establezca 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)
        ...
      }
      
  3. Después de que la pantalla gire, comprueba que la IU se adapte al nuevo diseño como se espera.

      @Test
      fun myRotationTest() {
        ...
        // Sets the device to landscape orientation during test execution.
        onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE)
        composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed()
        composeTestRule.onNodeWithTag("BottomBar").assertDoesNotExist()
      }
      

Cómo realizar una prueba contra el desplegado de la pantalla

A continuación, te mostramos un ejemplo de cómo probar lo que le sucede a tu app si está en un dispositivo plegable y se despliega la pantalla:

  1. Primero, realiza una prueba con el dispositivo en el estado plegado llamando a onDevice().setClosedMode(). Asegúrate de que el diseño de tu app se adapte al ancho de la pantalla compacta.

      @Test
      fun myUnfoldedTest() {
        onDevice().setClosedMode()
        composeTestRule.onNodeWithTag("BottomBar").assetIsDisplayed()
        composeTestRule.onNodeWithTag("NavRail").assetDoesNotExist()
        ...
      }
      
  2. Para hacer la transición a un estado completamente desplegado, llama a onDevice().setFlatMode(). Comprueba que el diseño de la app se adapte a la clase de tamaño expandido.

      @Test
      fun myUnfoldedTest() {
        onDevice().setClosedMode()
        ...
        onDevice().setFlatMode()
        composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed()
        composeTestRule.onNodeWithTag("BottomBar").assetDoesNotExist()
      }
      

Especifica los dispositivos que necesitan tus pruebas

Si estás ejecutando 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 que sean relevantes 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 esta regla 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 desplegado en una configuración plana, agrega el siguiente código @RequiresDeviceMode a la prueba:

@Test
@RequiresDeviceMode(mode = FLAT)
fun myUnfoldedTest() {
  ...
}