Les activités servent de conteneurs pour chaque interaction utilisateur dans votre application, donc il est important de tester le comportement des activités de votre application au niveau de l'appareil les événements suivants:
- Une autre application, telle que l'application pour téléphone de l'appareil, interrompt l'activité de votre application.
- Le système détruit et recrée votre activité.
- L'utilisateur place votre activité dans un nouvel environnement de fenêtrage, tel que en mode Picture-in-picture (PIP) ou multifenêtre.
En particulier, il est important de vous assurer que votre activité se comporte correctement dans aux événements décrits dans la section L'activité cycle de vie.
Ce guide explique comment évaluer la capacité de votre application à gérer les données. l'intégrité et une bonne expérience utilisateur lors de la transition des activités à travers différents états dans leur cycle de vie.
Gérer l'état d'une activité
L'un des aspects clés du test des activités de votre application consiste à placer
des activités dans des états spécifiques. Pour définir ce
« donné », de vos tests, utilisez
instances de ActivityScenario
,
une partie du
Bibliothèque AndroidX Test. Cette classe vous permet d'effectuer les opérations suivantes :
placer votre activité dans des états qui simulent des événements au niveau de l'appareil ;
ActivityScenario
est une API multiplate-forme que vous pouvez utiliser dans des tests unitaires locaux.
et d'intégration sur l'appareil. Sur un appareil réel ou virtuel,
ActivityScenario
assure la sécurité des threads en synchronisant les événements entre vos
thread d'instrumentation du test et le thread qui exécute votre activité testée.
L'API est particulièrement bien adaptée à l'évaluation de la façon dont une activité se comporte lorsqu'il est détruit ou créé. Cette section présente les fonctionnalités et les cas d'utilisation associés à cette API.
Créer une activité
Pour créer l'activité testée, ajoutez le code affiché dans l'extrait suivant:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { } } }
Une fois l'activité créée, ActivityScenario
la fait passer
RESUMED
. Cet état indique que votre activité est en cours d'exécution et qu'elle
visibles par les utilisateurs. Dans cet état, vous êtes libre d'interagir avec le
Les éléments View
à l'aide des tests de l'interface utilisateur Espresso.
Google vous recommande d'appeler close
sur l'activité lorsque le test
terminé. Cela nettoie les ressources associées et améliore
la stabilité de vos tests. ActivityScenario
implémente Closeable
pour que vous puissiez
appliquer l'extension use
, ou try-with-resources
dans le langage de programmation Java
pour que l'activité se ferme automatiquement.
Vous pouvez également utiliser ActivityScenarioRule
pour appeler automatiquement
ActivityScenario.launch
avant chaque test et ActivityScenario.close
lors de la suppression du test. L'exemple suivant montre comment définir une règle et obtenir une
instance d'un scénario à partir de celui-ci:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @get:Rule var activityScenarioRule = activityScenarioRule<MyActivity>() @Test fun testEvent() { val scenario = activityScenarioRule.scenario } }
Faire passer l'activité à un nouvel état
Pour diriger l'activité vers un état différent, tel que CREATED
ou STARTED
, appelez
moveToState()
Cette action simule une situation dans laquelle votre activité
arrêtée ou en pause, respectivement, parce qu'elle est interrompue par une autre application ou
l'action du système.
Un exemple d'utilisation de moveToState()
est présenté dans l'extrait de code suivant:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.moveToState(State.CREATED) } } }
Déterminer l'état actuel de l'activité
Pour déterminer l'état actuel d'une activité testée, obtenez la valeur de la
Champ state
dans votre objet ActivityScenario
. C'est particulièrement utile
pour vérifier l'état d'une activité testée si elle redirige les utilisateurs vers
une autre activité ou se termine tout seul, comme illustré dans le code suivant
snippet:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.onActivity { activity -> startActivity(Intent(activity, MyOtherActivity::class.java)) } val originalActivityState = scenario.state } } }
Recréer l'activité
Lorsqu'un appareil manque de ressources, le système peut détruire une activité,
sans demander à votre application de recréer cette activité lorsque l'utilisateur y retourne.
Pour simuler ces conditions, appelez recreate()
:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.recreate() } } }
La classe ActivityScenario
conserve l'état d'instance enregistré de l'activité et
tous les objets annotés à l'aide de @NonConfigurationInstance
. Ces objets chargent
dans la nouvelle instance de l'activité testée.
Récupérer les résultats d'une activité
Pour obtenir le code de résultat ou les données associées à une activité terminée, récupérez le
la valeur du champ result
dans votre objet ActivityScenario
, comme indiqué dans
l'extrait de code suivant:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testResult() { launchActivity<MyActivity>().use { onView(withId(R.id.finish_button)).perform(click()) // Activity under test is now finished. val resultCode = scenario.result.resultCode val resultData = scenario.result.resultData } } }
Déclencher des actions dans l'activité
Toutes les méthodes dans ActivityScenario
bloquent les appels. L'API requiert donc
de les exécuter dans le thread d'instrumentation.
Pour déclencher des actions dans l'activité testée, utilisez les outils de mise en correspondance des vues Espresso pour : interagissent avec les éléments de votre vue:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { onView(withId(R.id.refresh)).perform(click()) } } }
Toutefois, vous pouvez appeler une méthode sur l'activité elle-même.
en toute sécurité en implémentant ActivityAction
:
@RunWith(AndroidJUnit4::class) class MyTestSuite { @Test fun testEvent() { launchActivity<MyActivity>().use { scenario -> scenario.onActivity { activity -> activity.handleSwipeToRefresh() } } } }