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 est l'outil recommandé pour effectuer des actions au niveau de l'appareil en parallèle de vos règles de test Jetpack Compose. Si vous n'avez jamais écrit de tests d'UI pour Jetpack Compose, consultez Tester votre mise en page Compose.
L'API Espresso Device vous permet de déclencher des modifications de configuration sur un appareil virtuel et d'exécuter vos tests de manière synchrone. Ainsi, une seule action ou assertion d'interface utilisateur se produit à la fois, et vos résultats de test sont plus fiables. Si vous n'avez jamais écrit de tests d'UI avec Espresso, consultez sa documentation.
Pour utiliser l'API Espresso Device, vous avez besoin 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 :
Pour permettre au test de transmettre des commandes à l'appareil de test, ajoutez les autorisations réseau requises 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" />Si votre test cible Android 17 (niveau d'API 37) ou version ultérieure, vous devez également déclarer l'autorisation
ACCESS_LOCAL_NETWORK:<uses-permission android:name="android.permission.ACCESS_LOCAL_NETWORK" />Activez l'indicateur expérimental
enableEmulatorControldans le fichiergradle.properties:android.experimental.androidTest.enableEmulatorControl=trueActivez l'option
emulatorControldans le script de compilation au niveau du module :Kotlin
testOptions { emulatorControl { enable = true } }
Groovy
testOptions { emulatorControl { enable = true } }
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.1.0") }
Groovy
dependencies { androidTestImplementation 'androidx.test.espresso:espresso-device:1.1.0' }
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 déclencher des modifications de la configuration de l'appareil. Les exemples suivants montrent comment déclencher ces états d'appareil et vérifier les modifications de l'UI qui en résultent à l'aide des règles de test Compose.
Tester la rotation de l'écran
Pour tester la rotation de l'écran, vous pouvez utiliser la classe ScreenOrientationRule pour définir l'orientation de l'appareil pendant votre test.
Voici un exemple de test de ce qui se passe dans votre application lorsque l'écran de l'appareil pivote :
Tout d'abord, définissez votre règle de test Compose et utilisez la classe
ScreenOrientationRulepour définir l'appareil sur un état de départ cohérent (comme le mode Portrait) :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 votre test cible Android 17 (niveau d'API 37) ou une version ultérieure, l'API Espresso Device nécessite l'autorisation
ACCESS_LOCAL_NETWORK. Vous devez vous assurer que cette autorisation est accordée avant l'exécution de la règleScreenOrientationRule. UtilisezRuleChainde JUnit pour exécuter d'abord la règleGrantPermissionRule: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) }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) ... }Une fois l'écran pivoté, utilisez
composeTestRulepour vérifier que vos composables s'adaptent au nouvel état 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 :
Commencez par tester l'appareil en position pliée en appelant
onDevice().setClosedMode(). Assurez-vous que vos composables s'adaptent à la largeur d'écran compacte.@Test fun myUnfoldedTest() { onDevice().setClosedMode() composeTestRule.onNodeWithTag("BottomBar").assertIsDisplayed() composeTestRule.onNodeWithTag("NavRail").assertDoesNotExist() ... }Pour passer à un état entièrement déplié, appelez
onDevice().setFlatMode(). Vérifiez que les composables s'adaptent à la classe de taille étendue.@Test fun myUnfoldedTest() { onDevice().setClosedMode() ... onDevice().setFlatMode() composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed() composeTestRule.onNodeWithTag("BottomBar").assertDoesNotExist() }
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 n'exécuter que les tests pertinents pour l'appareil en cours d'exécution, utilisez l'annotation @RequiresDeviceMode. L'exécuteur de test 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éploiement à plat, ajoutez le code @RequiresDeviceMode suivant à votre test :
@Test
@RequiresDeviceMode(mode = FLAT)
fun myUnfoldedTest() {
...
}