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

Flaky Android Espresso Test - Закусочная

1) Все тестируемые устройства/эмуляторы отключили анимацию.

2) У меня есть @BeforeClass, который создает мой объект Credentials.

3) У меня есть IntenServiceIdlingResource и EventBusIdlingResource, зарегистрированные в @Before.

4) Когда нажата кнопка входа в систему, запускается IntentService. В этом случае сервер (издевавшийся сервер) возвращает ошибку 500. Эта информация отправляется обратно в интерфейс пользователя из IntentService через greenrobot EventBus, а Snackbar отображается с сообщением об ошибке.

Здесь код для теста:

@Test
public void a_userNamePasswordTest() throws Exception {
    // email input
    ViewInteraction userNameView = onView(withId(R.id.email));

    // verify it on screen and enabled
    userNameView.check(matches(isDisplayed())).check(matches(isEnabled()));

    // set the username
    userNameView.perform(scrollTo(), replaceText(credentials.username), closeSoftKeyboard());

    // password input
    ViewInteraction passwordView = onView(withId(R.id.password));

    // verify it on screen and enabled
    passwordView.check(matches(isDisplayed())).check(matches(isEnabled()));

    // set the password.
    passwordView.perform(scrollTo(), replaceText(credentials.password), closeSoftKeyboard());

    // sign in button
    ViewInteraction signInButton = onView(withId(R.id.email_sign_in_button));

    // verify the button
    signInButton.check(matches(allOf(
            isDisplayed(), isEnabled(), withText("Sign In"), withContentDescription("Sign In")
    )));

    // clickity click the button
    signInButton.perform(scrollTo(), click());

    // verify the snackbar text
    onView(withText(startsWith("Server Error: 500"))).check(matches(isDisplayed()));

}

Это исключение, которое я обычно получаю:

SignInExceptionTest > a_userNamePasswordTest [Nexus_6P_API_23 (AVD) - 6.0] FAILED         android.support.test.espresso.NoMatchingViewException: нет представлений в иерархии найдено совпадение: с текстом: строка, начинающаяся с "Ошибка сервера: 500"

Согласно моей регистрации, мои ресурсы на холостом ходу работают. Но, глядя на отметки времени для журналов, исключение происходит примерно через 5 секунд после того, как ресурсы холостого хода простаивают.

Кажется, есть задержка между тем, когда ресурсы простаивают, и когда он пытается искать представление.

Другие, возможно, соответствующие подробности:

  • minSdk: 20
  • compile и targetSdk: 25
  • buildTools: 25.0.2
  • поддержка-библиотека: 25.1.1
  • espresso-core: 2.2.2
  • gradle плагин 2.3.0-beta3

Как я могу исправить этот тест, чтобы он не шелушатся, кроме того, что накапливается время, когда отображаются мои закусочные?

4b9b3361

Ответ 1

Espresso активирует 5-секундное ожидание после того, как IdlingResource станет активным до того, как он снова будет проверен для простоя.

В моем случае это имеет 2 отрицательных воздействия.

Во-первых, он увеличивает время выполнения теста. Дополнительные 5 секунд (или несколько из 5) на каждом тесте могут действительно скомпоноваться.

Во-вторых, поскольку snackbar отображается немедленно и отображается только около 3,5 секунд, почти в любое время, когда вы ожидаете IdlingResource, закусочная будет упущена, прежде чем Espresso поймет, что ресурс простаивает, что затрудняет тест.

ConditionWatcher, описанный здесь: https://medium.com/azimolabs/wait-for-it-idlingresource-and-conditionwatcher-602055f32356#.9rms52osh

И код здесь: https://github.com/AzimoLabs/ConditionWatcher

Обеспечивает решение обеих этих проблем. Вместо 5 секунд значение по умолчанию составляет 250 мс, и это значение можно настроить (setWatchInterval).