@Test
public void shouldLogUserIn(){
//type in uername/password and close softkeyboard
onView(withId(R.id.username)).perform(typeText("username"));
onView(withId(R.id.userpassword)).perform(typeText("password"), closeSoftKeyboard());
//click login_button
onView(withId(R.id.login_button)).perform(click());
//wait for login background task, should take 5seconds at most
Systemclock.sleep(3000);
--- it fails here even increasing wait time to 2 minutes on slow emulator ---
//rest of the test codes here...
}
Ниже выдается ошибка:
android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with text: is "Andrew Bruce"
View Hierarchy:
+>DecorView{id=-1, visibility=VISIBLE, width=640, height=1280, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params=WM.LayoutParams{(0,0)(fillxfill) ty=1 fl=#81810100 pfl=0x20000 wanim=0x1030465 needsMenuKey=2}, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=3}
|
+->LinearLayout{id=-1, visibility=VISIBLE, width=640, height=1198, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params=android.widget.FrameLayout$LayoutParams@aca3a9f, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=2}
|
+-->ViewStub{id=16909288, res-name=action_mode_bar_stub, visibility=GONE, width=0, height=0, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=true, is-selected=false, layout-params=android.widget.LinearLayout$LayoutParams@bf197ec, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0}
|
+-->FrameLayout{id=-1, visibility=VISIBLE, width=640, height=1157, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params=android.widget.LinearLayout$LayoutParams@eafc7b5, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=41.0, child-count=1}
|
+--->ActionBarOverlayLayout{id=2131230776, res-name=decor_content_parent, visibility=VISIBLE, width=640, height=1157, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params=android.widget.FrameLayout$LayoutParams@aaf5e4a, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=2}
|
+---->ContentFrameLayout{id=16908290, res-name=content, visibility=VISIBLE, width=640, height=1062, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params=android.support.v7.widget.ActionBarOverlayLayout$LayoutParams@2a1e1bb, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=95.0, child-count=1}
|
+----->LinearLayout{id=-1, visibility=VISIBLE, width=640, height=1062, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, layout-params=android.widget.FrameLayout$LayoutParams@35646d8, tag=null, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=3}
|
Я тестирую простое приложение для Android с использованием фреймворка Espresso. Вышеупомянутый тест проходит на реальном устройстве, на быстром эмуляторе и даже на Circleci, но всегда терпит неудачу на медленном эмуляторе, что я намеренно сделал так.
Следует ли этот тип теста считать, пометить и завершить как пройденный или есть обходной путь?
Сделаю это, когда вернусь к своей системе. Но после ожидания фоновых задач входа в систему я пытался подтвердить, что вход был успешным, простым утверждением. // Check that the user is loggedin and correct name is displayed onView(ViewMatchers.withText("Andrew Bruce")).check(ViewAssertions.matches(ViewMatchers.isDisplayed()));
Исключение говорит что-то вроде того, что в иерархии не найдено представлений ..... хотя и куча всего. Я думаю, что это bcus Espresso, который просто застрял при нажатии кнопки входа, поэтому следующий вид еще не загружен.
@ TheKarlo95, это часть моей ошибки. Спасибо.
Ваши тесты должны пройти как быстрое / медленное подключение к Интернету, разные размеры экрана и т. д. Проблема с вашим подходом заключается в том, что он будет ждать 3 секунды для каждого устройства, даже если в этом нет необходимости. Порог максимального количества секунд ожидания должен быть вашим выбором, но вы должны проверять, есть ли представление в небольших временных интервалах, чтобы предотвратить дальнейшее ожидание. Представьте, что у вас будет 80 тестов, и каждому нужно будет подождать 3 секунды при входе в систему, что приведет к дополнительным 4 минутам для завершения вашего теста. В реальном приложении этот сценарий становится намного хуже.
for(i in 0..10) {
SystemClock.sleep(300)
try {
onView(withText("Andrew Bruce")).check(matches(isDisplayed())
return
} catch (e : NoMatchingViewException) {
}
Вы можете проявить творческий подход и заставить эту структуру работать с любым другим утверждением / сопоставлением, я оставлю это вам. Не существует определенного рецепта идеального времени ожидания, вы должны решить, что сами
Не могли бы вы скопировать исключение вставки, которое вы получите.