Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Flaky Espresso测试:启动活动后测试失败并超时_Android_Kotlin_Android Espresso_Ui Testing - Fatal编程技术网

Android Flaky Espresso测试:启动活动后测试失败并超时

Android Flaky Espresso测试:启动活动后测试失败并超时,android,kotlin,android-espresso,ui-testing,Android,Kotlin,Android Espresso,Ui Testing,启动活动后,我的浓缩咖啡测试失败,45秒后超时 要启动活动,我使用InstrumentationRegistry.getInstrumentation().startActivitySync(intent)。 尽管活动正确启动,但测试在45秒后运行超时失败。 这只是偶尔发生的 请注意,我的应用程序在启动活动后立即通过OkHTTP获取一些内容。 我还使用了Firebase事件日志之类的库。 但是,我可以确认所有OkHTTP请求都在2-3秒内完成 有哪些可能的原因阻止浓缩咖啡完成测试? 如何调试此问

启动活动后,我的浓缩咖啡测试失败,45秒后超时

要启动活动,我使用
InstrumentationRegistry.getInstrumentation().startActivitySync(intent)
。 尽管活动正确启动,但测试在45秒后运行超时失败。 这只是偶尔发生的

请注意,我的应用程序在启动活动后立即通过
OkHTTP
获取一些内容。 我还使用了Firebase事件日志之类的库。 但是,我可以确认所有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
E/TestRunner:失败:registerWithoutUI(com.myapp.RegistrationTests) ----开始异常----- E/TestRunner:java.lang.RuntimeException:无法在45000秒内启动intent intent{act=android.intent.action.MAIN flg=0x14000000 cmp=com.myapp/com.myapp.navigation.StartupActivity}。也许主线程没有在合理的时间内空闲?可能会有一个动画或其他东西不断地重新绘制屏幕。或者该活动正在创建时进行网络调用?请参阅线程转储日志。作为参考,活动启动请求之前事件队列上次空闲的时间是1571388177991,现在队列最后空闲的时间是1571388191468。如果这些数字相同,则您的活动可能占用了事件队列。 在androidx.test.runner.MonitoringInstrumentation.startActivitySync(MonitoringInstrumentation.java:483) 在com.myapp.TestUtilKt.launchActivity上(TestUtil.kt:25) 在com.myapp.RobotKitKt.launchStartupActivity(RobotKit.kt:18)上 在com.myappe.RobotKitKt.premission\u new\u注册(RobotKit.kt:163) 在com.myapp.RegistrationTests.registerWithoutUI上(RegistrationTests.kt:48) 位于java.lang.reflect.Method.invoke(本机方法) 位于org.junit.runners.model.FrameworkMethod$1.runReflectVeCall(FrameworkMethod.java:50) 位于org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 位于org.junit.runners.model.FrameworkMethod.invokeeexplosive(FrameworkMethod.java: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.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 位于org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 访问org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 位于org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 位于org.junit.runners.ParentRunner.run(ParentRunner.java:363) 位于androidx.test.ext.junit.runners.AndroidJUnit4.run(AndroidJUnit4.java:104) 位于org.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(ParentRunner.java: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.run(JUnitCore.java:115) 在androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56) 位于androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:392) 位于android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2189)
-----结束异常------

我现在可以通过在前置条件代码中的几个位置插入
Thread.sleep()
来解决这个问题(在启动测试中的活动之前)


我希望我有时间深入研究浓缩咖啡来帮助解决所有这些麻烦。

你用Idleringrouces吗?现在IdlingResources支持
OkHttp
。如果能够正确处理呼叫,并且不会因时间流逝而死亡,那么就进行查找。在我的理解中,IdlingResources是告诉Espresso等待特定资源的一种手段。其基本原理是避免使用Thread.sleep()。但是,未能等待资源不是问题所在。这是一个相反的问题:浓缩咖啡似乎在等待一种不会闲置的资源。非常正确。它不可能是关于动画的,也许可以尝试其他服务器实例?这仅仅是这个特定的活动吗?没有动画。我现在将开始逐步禁用某些功能。但是,我真的很想从Espresso中提取调试信息,而不必滚动我自己的Espresso版本。