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 experimenta cambios de configuración comunes, como la rotación y el despliegue de la pantalla. La API de Espresso Device te permite simular estos cambios de configuración en un dispositivo virtual y ejecuta tus pruebas de forma síncrona, por lo que solo se realiza una acción o aserción de IU a la vez, y los resultados de las pruebas son 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 versiones posteriores
  • Android Emulator 33.1.10 o versiones posteriores
  • Dispositivo virtual de Android que ejecuta el nivel de API 24 o versiones posteriores

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

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

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

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

      android.experimental.androidTest.enableEmulatorControl=true
      
  3. Habilita la opción emulatorControl en la secuencia de comandos de compilación a nivel del 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 Espresso Device a tu proyecto:

    Kotlin

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

    Groovy

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

Cómo realizar pruebas en función de cambios de configuración comunes

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

Cómo realizar pruebas en función de la rotación de la pantalla

Este es un ejemplo de cómo probar lo que sucede con tu app cuando gira la pantalla del dispositivo:

  1. Primero, para un estado inicial coherente, configura 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 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)
        ...
      }
      
  3. Después de que gire la pantalla, verifica que la IU se adapte al nuevo diseño según lo previsto.

      @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 pruebas en función del despliegue de la pantalla

Este es un ejemplo de cómo probar lo que sucede con tu app si está en un dispositivo plegable y la pantalla se despliega:

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

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

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

Cómo especificar 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 que son 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 la regla de requisito 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() {
  ...
}