Подтвердить что ты не робот

Тестирование нескольких действий с эспрессо

Можно ли писать тесты по нескольким действиям с использованием рамки espresso для Android?

4b9b3361

Ответ 1

Да, это возможно. В одном из примеров они продемонстрировали это здесь 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)));
}

Прочитайте встроенный комментарий.

Ожидание загрузки новой активности по умолчанию не берется Espresso.

Ответ 2

Абсолютно возможно написать тест Espresso (или любой инструментальный), который пересекает несколько действий. Вы должны начать с одного действия, но можете перемещаться по пользовательскому интерфейсу своего приложения в другие действия. Единственное предостережение - из-за ограничений безопасности тестовый поток должен оставаться в рамках вашего прикладного процесса.

Ответ 3

Я тестировал это как:

onView(withId(R.id.hello_visitor)).perform(click());
pressBack();
onView(withId(R.id.hello_visitor)).check(matches(isDisplayed())); //fails here

Действие click запускает новую активность, очевидно.

Ответ 4

Предположим, что у вас есть два действия: ГлавнаяActivity и SearchResultsActivity. Для теста вы хотите сделать некоторые действия в HomeActivity и проверить результат на SearchResultsActivity. Затем тест будет написан следующим образом:

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"))));
    }

}

Итак, единственное, что вам нужно заботиться, это то, что вы должны расширить тестовый класс из ActivityInstrumentationTestCase2 < FirstActivity > и вызвать super ( FirstActivity.class) в своем конструктор.

Вышеприведенный пример довольно прост.

Предварительный пример (при запуске startActivityForResult):

Иногда действительно сложно ввести тест, где у вас все еще есть два действия A и B, а поток приложений отличается от предыдущего:

  • пользователь ничего не делает в активности A, но активность A вызывает startActivityForResult для запуска активности B;
  • тогда пользователь вводит некоторые входы и нажимает на активность B (эта часть является реальным тестом);
  • Наконец, действие B завершается, оно вызывает setResult и возобновляет активность A (здесь вы должны проверить результат).

Несмотря на то, что вся тестовая часть происходит в активности B, вам просто нужно проверить один крошечный фрагмент на активности A, но ваш тест должен простираться от ActivityInstrumentationTestCase2 < ActivityWhoCallsStartActivityForResult > , который является активностью A, но а не активность B. В противном случае, когда тестовая часть будет выполнена, активность A не будет возобновлена, у вас нет шансов проверить ваш результат.