Tester les changements de configuration de l'écran avec l'API Espresso Device

Utilisez l'API Espresso Device pour tester votre application lorsque l'appareil subit des modifications de configuration courantes, telles que la rotation et le dépliage de l'écran. L'API Espresso Device vous permet de simuler ces modifications de configuration sur un appareil virtuel et d'exécuter vos tests de manière synchrone. Ainsi, une seule action ou assertion d'UI se produit à la fois, et vos résultats de test sont plus fiables. Si vous ne connaissez pas encore les tests d'UI avec Espresso, consultez sa documentation.

Pour utiliser l'API Espresso Device, vous devez disposer des éléments suivants :

  • Android Studio Iguana ou version ultérieure
  • Plug-in Android Gradle 8.3 ou version ultérieure
  • Android Emulator 33.1.10 ou version ultérieure
  • Un appareil virtuel Android exécutant le niveau d'API 24 ou supérieur

Configurer votre projet pour l'API Espresso Device

Pour configurer votre projet afin qu'il soit compatible avec l'API Espresso Device, procédez comme suit :

  1. Pour permettre au test de transmettre des commandes à l'appareil de test, ajoutez les autorisations INTERNET et ACCESS_NETWORK_STATE au fichier manifeste dans l'ensemble de sources androidTest :

      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
      
  2. Activez l'indicateur expérimental enableEmulatorControl dans le fichier gradle.properties :

      android.experimental.androidTest.enableEmulatorControl=true
      
  3. Activez l'option emulatorControl dans le script de compilation au niveau du module :

    Kotlin

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      

    Groovy

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      
  4. Dans le script de compilation au niveau du module, importez la bibliothèque Espresso Device dans votre projet :

    Kotlin

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

    Groovy

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

Tester les modifications de configuration courantes

L'API Espresso Device propose plusieurs états d'orientation de l'écran et de pliage que vous pouvez utiliser pour simuler des modifications de la configuration de l'appareil.

Tester la rotation de l'écran

Voici un exemple de test de ce qui se passe dans votre application lorsque l'écran de l'appareil pivote :

  1. Tout d'abord, pour obtenir un état de départ cohérent, définissez le mode Portrait sur l'appareil :

      import androidx.test.espresso.device.action.ScreenOrientation
      import androidx.test.espresso.device.rules.ScreenOrientationRule
      ...
      @get:Rule
      val screenOrientationRule: ScreenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT)
      
  2. Créez un test qui définit l'orientation du périphérique sur le mode paysage lors de l'exécution du test :

      @Test
      fun myRotationTest() {
        ...
        // Sets the device to landscape orientation during test execution.
        onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE)
        ...
      }
      
  3. Une fois l'écran pivoté, vérifiez que l'UI s'adapte à la nouvelle mise en page comme prévu.

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

Tester le déploiement de l'écran

Voici un exemple de test de ce qui se passe pour votre application si elle se trouve sur un appareil pliable et que l'écran se déplie :

  1. Commencez par tester l'appareil en position pliée en appelant onDevice().setClosedMode(). Assurez-vous que la mise en page de votre application s'adapte à la largeur d'écran compacte.

      @Test
      fun myUnfoldedTest() {
        onDevice().setClosedMode()
        composeTestRule.onNodeWithTag("BottomBar").assetIsDisplayed()
        composeTestRule.onNodeWithTag("NavRail").assetDoesNotExist()
        ...
      }
      
  2. Pour passer à un état entièrement déplié, appelez onDevice().setFlatMode(). Vérifiez que la mise en page de l'application s'adapte à la classe de taille étendue.

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

Spécifier les appareils dont vos tests ont besoin

Si vous exécutez un test qui effectue des actions de pliage sur un appareil non pliable, le test échouera probablement. Pour exécuter uniquement les tests pertinents pour l'appareil en cours d'exécution, utilisez l'annotation @RequiresDeviceMode. Le programme d'exécution des tests ignore automatiquement l'exécution des tests sur les appareils qui ne sont pas compatibles avec la configuration testée. Vous pouvez ajouter la règle d'exigence de l'appareil à chaque test ou à une classe de test entière.

Par exemple, pour spécifier qu'un test ne doit être exécuté que sur les appareils qui prennent en charge le dépliage en configuration à plat, ajoutez le code @RequiresDeviceMode suivant à votre test :

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