tôi có một cái nhìn trong đó một yếu tố khá sôi động với những điều sau đây trong một vòng lặp vô hạn:Espresso đóng băng trên quan điểm với hoạt ảnh lặp
<translate
android:fromXDelta="0%"
android:toXDelta="100%"
android:duration="10000"
android:repeatCount="-1"
android:repeatMode="reverse"/>
Khi Espresso mở hoạt động của tôi, nó có thể thực hiện một số hoạt động nhưng nhanh chóng bị đóng băng . Tôi cho rằng Espresso đang chờ thread UI trở nên nhàn rỗi mà không bao giờ xảy ra trong trường hợp này.
Cách duy nhất để tôi kiểm tra chế độ xem này để triển khai cơ chế tắt hoạt ảnh? Tôi có thể có một lớp khác xử lý hình ảnh động, mà sẽ được chế giễu cho các bài kiểm tra. Hoặc xây dựng các điều kiện thời gian.
Edit: tôi vẫn chưa tạo ra một dự án mẫu để cố gắng tái tạo lại vấn đề này, nhưng đây là một số thông tin chi tiết trong khi chờ đợi:
1) Tôi đang sử dụng Jake Wharton của ActivityRule
có hoạt tính của tôi tự động đưa ra (https://gist.github.com/JakeWharton/1c2f2cadab2ddd97f9fb).
2) Đây là thử nghiệm của tôi:
onView(withId(R.id.btn_yes)).perform(click());
3) Đây là stack trace hoàn tất. Lưu ý 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) Ngăn xếp dấu vết khi tạm dừng việc thực hiện các bài kiểm tra trong khi nó đông lạnh:
Chủ đề # 1:
"Instr: [email protected]4549" 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)
Chủ đề # 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)
Sự hiểu biết của tôi là 'MessageQueue' tự coi là không hoạt động nếu không có tin nhắn nào sẵn sàng * ngay bây giờ *, vì vậy một hoạt ảnh vô hạn không nên ngăn điều đó. Tôi sẽ hồ sơ ứng dụng của bạn với công cụ 'monitor' để xem những gì khác đang diễn ra trên chủ đề chính. Có lẽ một số mã xấu là lặp đi lặp lại lập kế hoạch chính nó với không có sự chậm trễ. –
Chuỗi giao diện người dùng được coi là không hoạt động, nếu hàng đợi tin nhắn trống hoặc getWhen() - now() nhỏ hơn 17ms. Vì vậy, một hình ảnh động sẽ chặn chủ đề ui. Tuy nhiên những gì bạn mô tả không phù hợp với các triệu chứng thông thường. Nếu chuỗi giao diện người dùng không hoạt động trong 60 giây, Espresso sẽ không thực hiện được thử nghiệm với ngoại lệ. @mieroy: Bạn đã chờ đợi điều này lâu chưa? Nếu bạn chạy thử nghiệm của bạn trong chế độ gỡ lỗi và thực hiện ngắt trong trình gỡ lỗi, dấu vết ngăn xếp bạn nhận được cho chuỗi thực hiện thử nghiệm là gì và nó là gì cho chuỗi chính của ứng dụng của bạn? – haffax
@haffax, tôi đã thêm vào câu hỏi của mình 3 dấu vết ngăn xếp: runner thử nghiệm & chủ đề chính trong quá trình thực hiện (điểm # 4) và lỗi sau 60s (điểm # 3). Tôi phải thừa nhận tôi không hiểu rõ cách các sự kiện hoạt hình được lên kế hoạch và cơ chế phát hiện nhàn rỗi hoạt động như thế nào. – siger