Tester les activités de votre application

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()
            }
        }
    }
}