Est-il possible d'écrire des tests sur plusieurs activités en utilisant le cadre Android expresso?
Oui c'est possible. Dans l'un des exemples, ils l'ont démontré ici https://github.com/googlesamples/Android-testing/blob/master/ui/espresso/BasicSample/app/src/androidTest/Java/com/example/ Android/testing/espresso/BasicSample/ChangeTextBehaviorTest.Java
@Test
public void changeText_newActivity() {
// Type text and then press the button.
onView(withId(R.id.editTextUserInput)).perform(typeText(STRING_TO_BE_TYPED),
closeSoftKeyboard());
onView(withId(R.id.activityChangeTextBtn)).perform(click());
// This view is in a different Activity, no need to tell Espresso.
onView(withId(R.id.show_text_view)).check(matches(withText(STRING_TO_BE_TYPED)));
}
Lisez le commentaire en ligne.
L'attente du chargement de la nouvelle activité est implicitement prise en charge par Espresso.
Il est absolument possible d'écrire un test Espresso (ou tout autre instrumentation) qui traverse plusieurs activités. Vous devez commencer par une activité, mais vous pouvez naviguer dans l'interface utilisateur de votre application vers d'autres activités. La seule mise en garde - en raison de restrictions de sécurité, le flux de test doit rester dans le processus de votre application.
J'ai testé cela comme:
onView(withId(R.id.hello_visitor)).perform(click());
pressBack();
onView(withId(R.id.hello_visitor)).check(matches(isDisplayed())); //fails here
L'action de clic démarre une nouvelle activité, évidemment.
Supposons que vous ayez deux activités: HomeActivity et SearchResultsActivity. Pour le test, vous souhaitez effectuer certaines actions sur HomeActivity et vérifier le résultat sur SearchResultsActivity. Ensuite, le test sera écrit comme ci-dessous:
public class SearchTest extends ActivityInstrumentationTestCase2<HomeActivity> {
public SearchTest() {
super(HomeActivity.class);
}
protected void setUp() throws Exception {
super.setUp();
getActivity(); // launch HomeActivity
}
protected void tearDown() throws Exception {
super.tearDown();
}
public void testSearch() {
onView(withId(R.id.edit_text_search_input)).perform(typeText("Hello World"));
onView(withId(R.id.button_search)).perform(click());
// at this point, another activity SearchResultsActivity is started
onView(withId(R.id.text_view_search_result)).check(matches(withText(containsString("Hello World"))));
}
}
Donc, la seule chose à laquelle vous devez faire attention, c'est que vous devez étendre la classe de test à partir d'ActivityInstrumentationTestCase2 <FirstActivity>, et appeler super (FirstActivity. Class) dans votre constructeur.
L'exemple ci-dessus est assez facile.
exemple avancé (lorsque startActivityForResult se produit):
Parfois, il est vraiment déroutant d'écrire un test, où vous avez toujours deux activités A et B, et le flux d'application est différent de celui ci-dessus:
Même si toute la partie des tests se produit sur l'activité B, vous devrez peut-être simplement vérifier un petit morceau sur l'activité A, mais votre test devrait s'étendre à partir de ActivityInstrumentationTestCase2 <ActivityWhoCallsStartActivityForResult> qui est l'activité A, mais pas l'activité B Sinon, lorsque la partie test est terminée, l'activité A ne reprendra pas, vous n'avez aucune chance de vérifier votre résultat.