web-dev-qa-db-fra.com

Tester plusieurs activités avec espresso

Est-il possible d'écrire des tests sur plusieurs activités en utilisant le cadre Android expresso?

39
fernandohur

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.

38
Jigish Chawda

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.

11
ValeraZakharov

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.

8
stef

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:

  1. l'utilisateur ne fait rien sur l'activité A, mais l'activité A appelle startActivityForResult pour lancer l'activité B;
  2. puis l'utilisateur fait quelques entrées et clique sur l'activité B (cette partie est le vrai test);
  3. enfin l'activité B se termine, elle appelle setResult et reprend l'activité A (vous devez vérifier le résultat ici).

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.

7
Jing Li