Можно ли писать тесты по нескольким действиям с использованием рамки espresso для Android?
Тестирование нескольких действий с эспрессо
Ответ 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 не будет возобновлена, у вас нет шансов проверить ваш результат.