13

1) Все тестируемые устройства/эмуляторы отключены.Flaky Android Espresso Test - Закусочная

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

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

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

Вот код для теста:

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

    // verify it's 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's 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: No views in hierarchy found matching: with text: a string starting with "Server Error: 500"

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

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

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

  • minSdk: 20
  • компилировать & targetSdk: 25
  • : 25.0.2 инструмент сборки
  • поддержка библиотека: 25.1.1
  • эспрессо-ядро : 2.2.2
  • gradle plugin 2.3.0-beta3

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

ответ

12

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

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

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

Во-вторых, поскольку закусочная отображается немедленно и отображается всего около 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).

+0

СПАСИБО. Зависимость эспрессо от IdlingResource заставляла меня бананами. В моих классах нет веских оснований для того, чтобы скрещивать тестовый код рамки, и вот как это должно быть сделано правильно. Я все еще не могу поверить, что у эспрессо уже нет такого! –