Testar mudanças na configuração da tela com a API Espresso Device

Use a API de dispositivo do Espresso para testar seu app quando o dispositivo passa por mudanças de configuração comuns, como rotação e abertura da tela. A API de dispositivo do Espresso permite simular essas mudanças de configuração em um dispositivo virtual e executa os testes de forma síncrona. Assim, apenas uma ação ou declaração de IU acontece por vez, e os resultados do teste são mais confiáveis. Se você não tem experiência em escrever testes de IU com o Espresso, consulte a documentaçãodele.

Para usar a API de dispositivo do Espresso, você precisa do seguinte:

  • Android Studio Iguana ou versão mais recente
  • Plug-in do Android para Gradle 8.3 ou versão mais recente
  • Android Emulator 33.1.10 ou versão mais recente
  • Dispositivo virtual Android que executa o nível 24 da API ou versão mais recente

Configurar seu projeto para a API de dispositivo do Espresso

Para configurar seu projeto para que ele ofereça suporte à API de dispositivo do Espresso, faça o seguinte:

  1. Para permitir que o teste transmita comandos ao dispositivo de teste, adicione as INTERNET e ACCESS_NETWORK_STATE permissões ao arquivo de manifesto no conjunto de origem androidTest:

      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
      
  2. Ative a flag experimental enableEmulatorControl no gradle.properties arquivo:

      android.experimental.androidTest.enableEmulatorControl=true
      
  3. Ative a opção emulatorControl no script de build no nível do módulo:

    Kotlin

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      

    Groovy

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      
  4. No script de build no nível do módulo, importe a biblioteca de dispositivos do Espresso para o projeto:

    Kotlin

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

    Groovy

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

Testar mudanças de configuração comuns

A API de dispositivo do Espresso tem várias orientações de tela e estados dobráveis que podem ser usados para simular mudanças de configuração do dispositivo.

Testar a rotação da tela

Confira um exemplo de como testar o que acontece com seu app quando a tela do dispositivo gira:

  1. Primeiro, para um estado inicial consistente, defina o dispositivo para o modo retrato:

      import androidx.test.espresso.device.action.ScreenOrientation
      import androidx.test.espresso.device.rules.ScreenOrientationRule
      ...
      @get:Rule
      val screenOrientationRule: ScreenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT)
      
  2. Crie um teste que defina o dispositivo para a orientação paisagem durante a execução do teste:

      @Test
      fun myRotationTest() {
        ...
        // Sets the device to landscape orientation during test execution.
        onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE)
        ...
      }
      
  3. Depois que a tela girar, verifique se a interface se adapta ao novo layout conforme o 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()
      }
      

Testar a abertura da tela

Confira um exemplo de como testar o que acontece com seu app se ele estiver em um dispositivo dobrável e a tela for aberta:

  1. Primeiro, teste com o dispositivo dobrado chamando onDevice().setClosedMode(). Verifique se o layout do app se adapta à largura da tela compacta.

      @Test
      fun myUnfoldedTest() {
        onDevice().setClosedMode()
        composeTestRule.onNodeWithTag("BottomBar").assetIsDisplayed()
        composeTestRule.onNodeWithTag("NavRail").assetDoesNotExist()
        ...
      }
      
  2. Para fazer a transição para um estado totalmente aberto, chame onDevice().setFlatMode(). Verifique se o layout do app se adapta a classe de tamanho expandida.

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

Especificar os dispositivos necessários para os testes

Se você estiver executando um teste que realiza ações de dobragem em um dispositivo que não é dobrável, é provável que o teste falhe. Para executar apenas os testes relevantes para o dispositivo em execução, use a anotação @RequiresDeviceMode. O executor de testes ignora automaticamente a execução de testes em dispositivos que não oferecem suporte à configuração que está sendo testada. Você pode adicionar a regra de requisito do dispositivo a cada teste ou a uma classe de teste inteira.

Por exemplo, para especificar que um teste só pode ser executado em dispositivos que oferecem suporte a abertura para uma configuração plana, adicione o seguinte código @RequiresDeviceMode ao teste:

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