Espresso использует очередь, чтобы проверить, не запущено ли приложение.
Thread.sleep(x) = //Waits x
uiController.loopMainThreadForAtLeast(x) // Waits x + more if app is still not idle
Теперь оба эти подхода действительно плохие, что приведет к некоторым проблемам в рабочем коде.
Espresso может определить, не используется ли приложение, если вы используете AsyncTasks, но в некоторых случаях это невозможно.Поэтому, даже если ваше приложение не бездействует, uiController.loopMainThreadForAtLeast(x)
будет пропущено.
Использование IdlingResources
внутри производственного кода для указания, когда приложение не бездействует, не является хорошим решением.Вы не должны изменять производственный код для тестирования своего приложения, а проверка ресурсов на холостом ходу проверяет, простаивает ли приложение с 5-секундными интервалами, что приведет к большим накладным расходам в ваших тестах.Предположим, что у вас есть 100 тестовых случаев, в которых вы будете испытывать этот интервал, накладные расходы будут огромными
Использование Thread.sleep(x)
само по себе, очевидно, плохая идея.Поскольку ваши тесты должны быть стабильными независимо от скорости интернет-соединения, телефона и т. Д., Вам не следует ждать фиксированное количество времени.И вы не можете знать, сколько вам нужно ждать, когда вы запрашиваете что-то с сервера, поэтому x
вы решите, будет ли он слишком большим или слишком маленьким.
Лучшее решениесостоит в том, чтобы проверить, существует ли целевое представление в вашем утверждении / действии, и если нет, проверьте целевое представление снова через X секунд (где X - небольшое число, например 200 миллис).Также использование Thread.sleep()
работало для меня лучше, чем использование uiController.loopMainThreadForAtLeast (), когда мое приложение отображало анимацию (даже когда анимации были закрыты из testOptions и настроек телефона)