После запуска занятия мой тест эспрессо не проходит с таймаутом через 45 секунд.
Для запуска активности я использую InstrumentationRegistry.getInstrumentation().startActivitySync(intent)
. Несмотря на то, что действие запускается правильно, тест выдает ошибку тайм-аута через 45 секунд. Это случается только изредка.
Обратите внимание, что мое приложение получает некоторые данные через OkHTTP
сразу после запуска действия. Я также использую библиотеки, такие как Firebase Event Logging. Однако я могу подтвердить, что все запросы OkHTTP выполняются в течение 2-3 секунд.
Каковы возможные причины, по которым эспрессо не может завершить тест? Как я могу отладить эту проблему?
Вот трассировки стека при истечении времени ожидания:
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
Теперь я смог обойти проблему, вставив InstrumentationRegistry.getInstrumentation().startActivitySync(intent)
в несколько мест в моем коде предварительного условия (перед запуском тестируемого действия).