Следует ли пройти тест на медленном эмуляторе, прежде чем он считается пройденным?

@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, но всегда терпит неудачу на медленном эмуляторе, что я намеренно сделал так.

Следует ли этот тип теста считать, пометить и завершить как пройденный или есть обходной путь?

Не могли бы вы скопировать исключение вставки, которое вы получите.

TheKarlo95 18.12.2018 15:29

Сделаю это, когда вернусь к своей системе. Но после ожидания фоновых задач входа в систему я пытался подтвердить, что вход был успешным, простым утверждением. // Check that the user is loggedin and correct name is displayed onView(ViewMatchers.withText("Andrew Bruce")).check(ViewAssertions.matches(ViewMatchers.isDisplay‌​ed())); Исключение говорит что-то вроде того, что в иерархии не найдено представлений ..... хотя и куча всего. Я думаю, что это bcus Espresso, который просто застрял при нажатии кнопки входа, поэтому следующий вид еще не загружен.

pasignature 18.12.2018 16:50

@ TheKarlo95, это часть моей ошибки. Спасибо.

pasignature 19.12.2018 16:47
0
3
59
1

Ответы 1

Ваши тесты должны пройти как быстрое / медленное подключение к Интернету, разные размеры экрана и т. д. Проблема с вашим подходом заключается в том, что он будет ждать 3 секунды для каждого устройства, даже если в этом нет необходимости. Порог максимального количества секунд ожидания должен быть вашим выбором, но вы должны проверять, есть ли представление в небольших временных интервалах, чтобы предотвратить дальнейшее ожидание. Представьте, что у вас будет 80 тестов, и каждому нужно будет подождать 3 секунды при входе в систему, что приведет к дополнительным 4 минутам для завершения вашего теста. В реальном приложении этот сценарий становится намного хуже.

for(i in 0..10) {
 SystemClock.sleep(300)    
    try {
        onView(withText("Andrew Bruce")).check(matches(isDisplayed())
        return
    } catch (e : NoMatchingViewException) {

}

Вы можете проявить творческий подход и заставить эту структуру работать с любым другим утверждением / сопоставлением, я оставлю это вам. Не существует определенного рецепта идеального времени ожидания, вы должны решить, что сами

Другие вопросы по теме