Тест эспрессо застрял / неактивен после выполнения (щелчка ()) на кнопке в ViewAnimator
Проблема: у меня возникла проблема во время выполнения теста Espresso, после вызова метода execute (click()) для кнопки входа в систему тест продолжает работать, но не продолжается, пока не пройдет 45 секунд, и тест автоматически завершится неудачей., Между тем, вход в систему происходит нормально.
Контекст: у меня есть Activity с двумя фрагментами рядом, фрагмент справа обрабатывает имя пользователя и пароль EditTexts, а также кнопку входа в систему. Этот фрагмент построен с использованием ViewAnimator и двух LinearLayout в качестве дочерних представлений, первый LinearLayout содержит элементы, упомянутые ранее, а второй - другие элементы.
Вот что происходит в пользовательском интерфейсе при нажатии кнопки входа в систему:
@Override
public void setUILoggingIn() {
spinnerLogin.setVisibility(View.VISIBLE);
loginButton.setEnabled(false);
loginButton.setText(R.string.logging_in);
usernameText.setEnabled(false);
passwordText.setEnabled(false);
}
После аутентификации на сервере вот как я обрабатываю интерфейс:
@Override
public void setUIAuthorized() {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
viewAnimator.showNext();
// elements on the first child of the ViewAnimator
loginButton.setEnabled(true);
spinnerLogin.setVisibility(View.GONE);
// elements on the second child of the ViewAnimator
sendMessageButton.setEnabled(true);
chatInputText.setEnabled(true);
}
});
}
Эспрессо Тест
ViewInteraction loginButton2 = onView(withId(R.id.login_button));
loginButton2.perform(click()); // Test gets stuck here.
loginButton2.check(doesNotExist()); // Never reached.
Кто-нибудь знает, как успешно тестировать по этому сценарию? Этого будет достаточно, чтобы определить, когда изменяется ViewAnimator, но тест застревает при щелчке.
Также: это было не начало теста, прежде чем код, показанный ранее, я запускаю этот тест, и он работает как сон:
ViewInteraction loginButton = onView(withId(R.id.login_button));
/** Failed login **/
loginButton.perform(click());
ViewInteraction snackBarTextView = onView(
allOf(withId(R.id.snackbar_text), withText("Login error"), isDisplayed()));
snackBarTextView.check(matches(withText("Login error")));
Спасибо всем за помощь и советы
2 ответа
У меня была похожая проблема, и в моем случае это был индикатор выполнения, который был загружен на фрагмент, который не отображался. Этот индикатор не был отклонен по ошибке и блокировал тесты. У меня был тот же результат с ошибками тестов через 45 секунд, как вы описали. Подводя итог, убедитесь, что в потоке пользовательского интерфейса нет анимации в виде индикатора выполнения или любого другого.
У меня была та же проблема, когда я работал с ListView.
Интересно, что я заметил, что тест возобновится, если я попытаюсь прокрутить экран вручную. Добавление этой строки решило проблему и возобновило тестирование.
onView(withId(R.id.myListView)).perform(swipeUp());