Чем uiController.loopMainThreadForAtLeast отличается от Thread.sleep? - PullRequest
1 голос
/ 31 мая 2019

В это видео из Google I / O 2016 , Войтек Каличински рекомендует использовать uiController.loopMainThreadForAtLeast вместо Thread.sleep в тестах эспрессо. Конечно, контекст связан с Idling Resources, но в чем разница между ними и почему один лучше другого?

1 Ответ

1 голос
/ 07 июня 2019

Espresso использует очередь, чтобы проверить, не запущено ли приложение.

Thread.sleep(x) = //Waits x 
uiController.loopMainThreadForAtLeast(x) // Waits x + more if app is still not idle

Теперь оба эти подхода действительно плохие, что приведет к некоторым проблемам в рабочем коде.

  1. Espresso может определить, не используется ли приложение, если вы используете AsyncTasks, но в некоторых случаях это невозможно.Поэтому, даже если ваше приложение не бездействует, uiController.loopMainThreadForAtLeast(x) будет пропущено.

  2. Использование IdlingResources внутри производственного кода для указания, когда приложение не бездействует, не является хорошим решением.Вы не должны изменять производственный код для тестирования своего приложения, а проверка ресурсов на холостом ходу проверяет, простаивает ли приложение с 5-секундными интервалами, что приведет к большим накладным расходам в ваших тестах.Предположим, что у вас есть 100 тестовых случаев, в которых вы будете испытывать этот интервал, накладные расходы будут огромными

  3. Использование Thread.sleep(x) само по себе, очевидно, плохая идея.Поскольку ваши тесты должны быть стабильными независимо от скорости интернет-соединения, телефона и т. Д., Вам не следует ждать фиксированное количество времени.И вы не можете знать, сколько вам нужно ждать, когда вы запрашиваете что-то с сервера, поэтому x вы решите, будет ли он слишком большим или слишком маленьким.

Лучшее решениесостоит в том, чтобы проверить, существует ли целевое представление в вашем утверждении / действии, и если нет, проверьте целевое представление снова через X секунд (где X - небольшое число, например 200 миллис).Также использование Thread.sleep() работало для меня лучше, чем использование uiController.loopMainThreadForAtLeast (), когда мое приложение отображало анимацию (даже когда анимации были закрыты из testOptions и настроек телефона)

...