Как я могу обойти AppNotIdleException для представления, которое перерисовывается каждую секунду? - PullRequest
0 голосов
/ 23 мая 2018

Я тестирую приложение Android с графиком индикатора, где элемент на экране (индикатор) перерисовывается каждую секунду.Идея состоит в том, что я нажимаю кнопку запуска, и прибор включается, а когда я нажимаю кнопку остановки, прибор выключается.

Вручную это работает нормально, но когда я запускаю свои тесты Espresso, тест зависает после нажатия «Пуск», потому что приложение никогда не работает, так как оно перерисовывается каждую секунду.Как и ожидалось, я получаю:

android.support.test.espresso.AppNotIdleException: зацикливание для 13452 итераций в течение 60 секунд.Следующие условия ожидания не выполнены.

Я обнаружил noActivity () в Документах для разработчиков Android , полагая, что это может быть полезно, но я не могу понять, как правильно его использовать, и не могунайти хорошие примеры.Кнопка «Стоп» явно находится на странице, но этот шаг пропущен, и он переходит прямо к tearDown (), который говорит мне, что я не правильно его использую или не понимаю, что он делает:

    onView(withId(R.id.stop_button)).noActivity().perform()

Так как мне преодолеть это?Есть ли простой способ сказать Espresso не использовать ресурсы холостого хода для определенного теста или его части?Нужно ли писать ресурс на холостом ходу, который говорит, что когда кнопка «Стоп» найдена, приложение не работаетЕсть ли другой метод, который я мог бы пропустить?

FWIW Я использую Kotlin, но я также приветствую ответы на Java, так как они очень похожи.Спасибо!

1 Ответ

0 голосов
/ 30 мая 2018

В вашем пользовательском представлении получите системную настройку ANIMATOR_DURATION_SCALE:

private fun getAnimatorSpeed() = 
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
  getAnimatorSpeedNew()
} else {
  getAnimatorSpeedOld()
}

@RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private fun getAnimatorSpeedNew() = Settings.Global.getFloat(
    context.contentResolver,
    Settings.Global.ANIMATOR_DURATION_SCALE,
    1f)

@Suppress("DEPRECATION")
private fun getAnimatorSpeedOld() = Settings.System.getFloat(
    context.contentResolver,
    Settings.System.ANIMATOR_DURATION_SCALE,
    1f)

Отключите перерисовку в вашем пользовательском представлении, когда скорость аниматора равна нулю.Пока вы работаете, вы можете настроить анимацию так, чтобы она соответствовала скорости системного аниматора.

Перед запуском тестов установите скорость системного аниматора на ноль, перейдя в Настройки> Параметры разработчика на вашем устройстве.

...