Эспрессо-тестирование ProgressBar, который быстро переключается - PullRequest
0 голосов
/ 25 августа 2018

У меня есть действие, которое запускает асинхронный запрос к серверу. Прямо при запуске я показываю индикатор выполнения. Когда результат возвращается в действие, я устанавливаю индикатор выполнения на View.GONE.

У меня сейчас два теста. Один для тестирования пытается войти с неправильными учетными данными который отлично работает:

@Test
public void tryLogin__withWrongPassword() {
    onView(withId(R.id.loginEmail))
            .perform(typeText("em@ail.com"), closeSoftKeyboard());
    onView(withId(R.id.loginPassword))
            .perform(typeText("123456789"), closeSoftKeyboard());
    onView(withId(R.id.loginSubmit))
            .perform(click());
    onView(withId(R.id.loginProgressBar))
            .check(matches(isDisplayed()));

    onView(isRoot()).perform(waitFor(3000));

    onView(withId(R.id.loginProgressBar))
            .check(matches(not((isDisplayed()))));
    onView(withId(R.id.loginPassword))
            .check(matches(hasErrorText("Wrong password")));
}

И тот, который я тестирую без подключения к интернету, который не работает:

@Test
public void tryLogin__withoutInternet() {
    onView(withId(R.id.loginEmail))
            .perform(typeText("em@ail.com"), closeSoftKeyboard());
    onView(withId(R.id.loginPassword))
            .perform(typeText("123456789"), closeSoftKeyboard());
    onView(withId(R.id.loginSubmit))
            .perform(click());
    onView(withId(R.id.loginProgressBar))
            .check(matches(isDisplayed()));

    onView(isRoot()).perform(waitFor(3000));

    onView(withId(R.id.loginProgressBar))
            .check(matches(not((isDisplayed()))));

    onView(withText("Network error, try again later"))
            .inRoot(withDecorView(not(mActivityRule.getActivity().getWindow().getDecorView())))
            .check(matches(isDisplayed()));
}

Тест не пройден, потому что в этом случае индикатор выполнения отображается за доли секунды (поскольку ошибка почти сразу же отправляется из модели представления) и, похоже, эспрессо не может поймать его, пока он еще загружается.

Мой вопрос: как это могло быть исправлено в моем тесте? Я где-то читал, что Espresso не может тестировать индикаторы выполнения, и совет заключался в том, чтобы вместо этого использовать UIAutomator, однако я только начал с инструментальных тестов и выбрал Espresso, и мне трудно найти идеальный инструмент для этого случая. Более того, кажется, что все работает нормально, когда индикатор выполнения отображается чуть более полсекунды (в моем первом тесте, например)

P.S. метод waitFor (long millis) - это дополнительный служебный метод, который я сделал, чтобы заставить Espresso ждать определенное количество времени, прежде чем что-то проверять (принудительно устанавливая тайм-аут как требование к качеству)

Изменить для уточнения: Мой главный вопрос здесь, если у кого-то есть идея, почему видимость не улавливается, когда она активна менее чем в течение определенного периода времени, по сравнению с тем, когда она длится более полсекунды, даже если проверка выполняется сразу после выполнения (щелкните ()) вызов.

...