Эспрессо замерзает при просмотре с анимацией цикла

У меня есть представление, в котором элемент анимируется со следующим в бесконечном цикле:

<translate
    android:fromXDelta="0%"
    android:toXDelta="100%"
    android:duration="10000"
    android:repeatCount="-1"
    android:repeatMode="reverse"/>

Когда Espresso открывает мою деятельность, он может выполнять некоторые операции, но быстро замерзает. Я полагаю, Espresso ждет, когда поток пользовательского интерфейса станет праздным, что никогда не произойдет в этом случае.

Я единственный способ проверить это представление для реализации механизма отключения анимации? Я мог бы создать анимацию с другими классами, которые будут издеваться над тестами. Или построить временные условные обозначения.

Изменить: Мне еще предстоит создать образец проекта, чтобы попытаться воссоздать проблему, но вот некоторые дополнительные детали:

1) Я использую Jake Wharton ActivityRule для автоматического запуска моей активности (https://gist.github.com/JakeWharton/1c2f2cadab2ddd97f9fb).

2) Это мой тест:

onView(withId(R.id.btn_yes)).perform(click());

3) Вот полная трассировка стека. Обратите внимание на AppNotIdleException:

Running tests
Test running started
android.support.test.espresso.PerformException: Error performing 'single click' on view 'with id: com.myapp:id/btn_yes'.
at android.support.test.espresso.PerformException$Builder.build(PerformException.java:83)
at android.support.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:70)
at android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:53)
at android.support.test.espresso.ViewInteraction.runSynchronouslyOnUiThread(ViewInteraction.java:185)
at android.support.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:115)
at android.support.test.espresso.ViewInteraction.perform(ViewInteraction.java:87)
at com.myapp.espresso.MyActivityTest.yesButtonTest(MyActivityTest.java:53)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at com.myapp.espresso.ActivityRule$2.evaluate(ActivityRule.java:129)
at org.junit.rules.RunRules.evaluate(RunRules.java:18)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:24)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
at org.junit.runner.JUnitCore.run(JUnitCore.java:136)
at android.support.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:270)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1837)
Caused by: android.support.test.espresso.AppNotIdleException: Looped for 3580 iterations over 60 SECONDS. The following Idle Conditions failed .
at android.support.test.espresso.IdlingPolicy.handleTimeout(IdlingPolicy.java:61)
at android.support.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.java:471)
at android.support.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.java:402)
at android.support.test.espresso.base.UiControllerImpl.injectMotionEvent(UiControllerImpl.java:226)
at android.support.test.espresso.action.MotionEvents.sendDown(MotionEvents.java:78)
at android.support.test.espresso.action.Tap.sendSingleTap(Tap.java:133)
at android.support.test.espresso.action.Tap.access$100(Tap.java:35)
at android.support.test.espresso.action.Tap$1.sendTap(Tap.java:40)
at android.support.test.espresso.action.GeneralClickAction.perform(GeneralClickAction.java:98)
at android.support.test.espresso.ViewInteraction$1.run(ViewInteraction.java:144)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

4) Трассировка стека при приостановке выполнения теста во время его замораживания:

Тема № 1:

"Instr: [email protected]" prio=5 waiting
  java.lang.Thread.State: WAITING
     blocks Instr: [email protected]
      at java.lang.Object.wait(Object.java:-1)
      at java.lang.Thread.parkFor(Thread.java:1220)
      - locked <0x13a3> (a java.lang.Object)
      at sun.misc.Unsafe.park(Unsafe.java:299)
      at java.util.concurrent.locks.LockSupport.park(LockSupport.java:157)
      at java.util.concurrent.FutureTask.awaitDone(FutureTask.java:400)
      at java.util.concurrent.FutureTask.get(FutureTask.java:162)
      at android.support.test.espresso.ViewInteraction.runSynchronouslyOnUiThread(ViewInteraction.java:181)
      at android.support.test.espresso.ViewInteraction.doPerform(ViewInteraction.java:115)
      at android.support.test.espresso.ViewInteraction.perform(ViewInteraction.java:87)

Тема № 2:

"[email protected]" prio=5 runnable
  java.lang.Thread.State: RUNNABLE
      at android.view.ThreadedRenderer.nSyncAndDrawFrame(ThreadedRenderer.java:-1)
      at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:333)
      at android.view.ViewRootImpl.draw(ViewRootImpl.java:2492)
      at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2337)
      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1968)
      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)
      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779)
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
      at android.view.Choreographer.doCallbacks(Choreographer.java:580)
      at android.view.Choreographer.doFrame(Choreographer.java:550)
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
      at android.os.Handler.handleCallback(Handler.java:739)
      at android.os.Handler.dispatchMessage(Handler.java:95)
      at android.support.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.java:461)
      at android.support.test.espresso.base.UiControllerImpl.loopUntil(UiControllerImpl.java:402)
      at android.support.test.espresso.base.UiControllerImpl.injectMotionEvent(UiControllerImpl.java:226)
      at android.support.test.espresso.action.MotionEvents.sendDown(MotionEvents.java:78)
      at android.support.test.espresso.action.Tap.sendSingleTap(Tap.java:133)
      at android.support.test.espresso.action.Tap.access$100(Tap.java:35)
      at android.support.test.espresso.action.Tap$1.sendTap(Tap.java:40)
      at android.support.test.espresso.action.GeneralClickAction.perform(GeneralClickAction.java:98)
      at android.support.test.espresso.ViewInteraction$1.run(ViewInteraction.java:144)
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
      at java.util.concurrent.FutureTask.run(FutureTask.java:237)
      at android.os.Handler.handleCallback(Handler.java:739)
      at android.os.Handler.dispatchMessage(Handler.java:95)
      at android.os.Looper.loop(Looper.java:135)
      at android.app.ActivityThread.main(ActivityThread.java:5221)
      at java.lang.reflect.Method.invoke(Method.java:-1)
      at java.lang.reflect.Method.invoke(Method.java:372)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

Ответы

Ответ 1

Да, проблема с тестом связана с анимацией.

Единственное решение, которое я могу придумать, - это отключить бесконечную анимацию.

В целом, при запуске функциональных тестов рекомендуется отключать анимацию, так как она всегда вносит некоторые ошибки.

Немного предыстории:

Поток пользовательского интерфейса никогда не простаивает с точки зрения эспрессо, потому что очередь сообщений всегда содержит событие, запланированное для обработки ближе, чем пороговое значение, используемое для определения того, не занят ли поток.

Когда вы смотрите на QueueInterrogator, вы видите, что он determineQueueState() возвращает TASK_DUE_SOON, когда очередь сообщений содержит событие, которое запланировано обработать менее чем за 16 мс. UiController продолжит выполнение только тогда, когда будут выполнены все условия простоя, в случае QueueInterrogator это только в том случае, если очередь сообщений пуста или следующее сообщение запланировано для обработки в 16 мс или позже..

Анимации сделают недействительным View, который они трансформируют, и это вызовет новый обход иерархии представлений с помощью Choreographer. И это триггерное сообщение, поступающее из ViewRoot в Choreographer, является тем, что удерживает вашу очередь сообщений потока пользовательского интерфейса не бездействующей.