Flaky Espresso тесты: тест не пройден с таймаутом после запуска действия - PullRequest
0 голосов
/ 18 октября 2019

После запуска занятия мой эспрессо-тест завершается неудачно с перерывом в 45 секунд.

Для запуска занятия я использую InstrumentationRegistry.getInstrumentation().startActivitySync(intent). Хотя действие запускается правильно, тест завершается ошибкой тайм-аута через 45 секунд. Это происходит только изредка.

Обратите внимание, что мое приложение извлекает некоторые вещи через OkHTTP сразу после запуска действия. Я также использую библиотеки, такие как Firebase Event Logging. Однако я могу подтвердить, что все запросы OkHTTP выполняются в течение 2-3 секунд.

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

Вот следы стека, когда происходит таймаут:

  Thread[Jit thread pool worker thread 0,5,main]

  Thread[arch_disk_io_3,5,main]
    sun.misc.Unsafe.park(Native Method)
    java.util.concurrent.locks.LockSupport.park(LockSupport.java:190)
    java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2067)
    java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1092)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    java.lang.Thread.run(Thread.java:919)

  Thread[AsyncTask #1,5,main]
    sun.misc.Unsafe.park(Native Method)
    java.util.concurrent.locks.LockSupport.park(LockSupport.java:190)
    java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:459)
    java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
    java.util.concurrent.SynchronousQueue.take(SynchronousQueue.java:920)
    java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1092)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    java.lang.Thread.run(Thread.java:919)

  Thread[Okio Watchdog,5,main]
    java.lang.Object.wait(Native Method)
    okio.AsyncTimeout.awaitTimeout(AsyncTimeout.java:361)
    okio.AsyncTimeout$Watchdog.run(AsyncTimeout.java:312)

  Thread[Timer-1,5,main]
    java.lang.Object.wait(Native Method)
    java.lang.Object.wait(Object.java:442)
    java.util.TimerThread.mainLoop(Timer.java:559)
    java.util.TimerThread.run(Timer.java:512)

  Thread[OkHttp ConnectionPool,5,main]
    java.lang.Object.wait(Native Method)
    com.android.okhttp.ConnectionPool$1.run(ConnectionPool.java:106)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    java.lang.Thread.run(Thread.java:919)

  Thread[RenderThread,7,main]

  Thread[HeapTaskDaemon,5,system]

  Thread[queued-work-looper,5,main]
    android.os.MessageQueue.nativePollOnce(Native Method)
    android.os.MessageQueue.next(MessageQueue.java:336)
    android.os.Looper.loop(Looper.java:174)
    android.os.HandlerThread.run(HandlerThread.java:67)

  Thread[hwuiTask1,6,main]

  Thread[ReferenceQueueDaemon,5,system]
    java.lang.Object.wait(Native Method)
    java.lang.Object.wait(Object.java:442)
    java.lang.Object.wait(Object.java:568)
    java.lang.Daemons$ReferenceQueueDaemon.runInternal(Daemons.java:215)
    java.lang.Daemons$Daemon.run(Daemons.java:137)
    java.lang.Thread.run(Thread.java:919)

  Thread[pool-1-thread-1,5,main]
    sun.misc.Unsafe.park(Native Method)
    java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:230)
    java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2109)
    java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1132)
    java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:849)
    java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1092)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    java.lang.Thread.run(Thread.java:919)

  Thread[OkHttp ConnectionPool,5,main]
    java.lang.Object.wait(Native Method)
    okhttp3.ConnectionPool$1.run(ConnectionPool.java:67)
    java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    java.lang.Thread.run(Thread.java:919)

  Thread[pool-5-thread-2,5,main]
    sun.misc.Unsafe.park(Native Met

E / TestRunner: fail: registerWithoutUI (com.myapp.RegistrationTests) ---- начало исключения ----- E / TestRunner: java.lang.RuntimeException: Не удалось запустить намерение Intent {act = android.intent.action.MAIN flg = 0x14000000 cmp = com.myapp / com.myapp.navigation. StartupActivity} в течение 45000 секунд. Возможно, основной поток не простаивал в течение разумного периода времени? Может быть анимация или что-то постоянно перекрашивающее экран. Или активность делает сетевые вызовы на создание? Смотрите логи threaddump. Для справки: в последний раз очередь событий простаивала до того, как ваш запрос на запуск активности был 1571388177991, а теперь последний раз, когда очередь простаивала, была: 1571388191468. Если эти числа одинаковы, ваша активность может зависеть от очереди событий. в androidx.test.runner. в com.myappe.RobotKitKt.precondition_new_registration (RobotKit.kt: 163) в com.myapp.RegistrationTests.registerWithoutUI (RegistrationTests.kt: 48) в java.lang.reflect.Method.invoke (родной метод) в орг.юнте. .model.FrameworkMethod $ 1.runReflectiveCall (FrameworkMethod.java:50) в org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java:12) в org.junit.runners.model.hoto.MramelyJava: 47) в org.junit.internal.runners.statements.InvokeMethod.evaluate (InvokeMethod.java:17) в androidx.test.internal.runner.junit4.statement.RunBefores.evaluate (RunBefores.java:80) в org.junit.runners.ParentRunner.runLeaf (ParentRunner.java:325) в org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner. Java: 78) в org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java:57) в org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:290) в org.junitRunners. (ParentRunner.java:71) в org.junit.runners.ParentRunner.runChildren (ParentRunner.java:288) в org.junit.runners.ParentRunner.access $ 000 (ParentRunner.java:58) в org.junit.Runner.Parent$ 2.junit.runners.Suite.runChild (Suite.java:128) в org.junit.runners.Suite.runChild (Suite.java:27) в org.junit.runners.ParentRunner $ 3.run (ParentRunner.java:290)в org.junit.runners.ParentRunner $ 1.schedule (ParentRunner.java:71) в org.junit.runners.ParentRunner.runChildren (ParentRunner.java:288) в org.junit.runners.ParentRunner.access $ 000 (родитель): 58) в org.junit.runners.ParentRunner $ 2.evaluate (ParentRunner.java:268) в org.junit.runners.ParentRunner.run (ParentRunner.java:363) в org.junit.runner.JUnitCore.run (JUnitCore.java:137) в org.junit.runner.JUnitCore.rore (JUnit: 115)на androidx.test.internal.runner.TestExecutor.execute (TestExecutor.java:56) на androidx.test.runner.AndroidJUnitRunner.onStart (AndroidJUnitRunner.java:392) на android.app.Instrumentation $ InstrumentationThread.run (инструментарий): 2189) ----- конец исключения -----

1 Ответ

0 голосов
/ 21 октября 2019

Теперь я мог обойти эту проблему, вставив Thread.sleep() в несколько мест в моем коде предварительного условия (до запуска тестируемого действия).

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

...