2015-04-09 19 views
10

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) 
+0

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ễ. –

+0

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

+0

@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

Trả lời

12

Có, sự cố bạn gặp phải với thử nghiệm là do hoạt ảnh.

Giải pháp duy nhất tôi có thể nghĩ là thực sự tắt hoạt ảnh vô hạn.

Nói chung, nên tắt hoạt ảnh khi chạy thử nghiệm chức năng vì chúng luôn giới thiệu một số lỗi.

Một chút nền:

Các thread UI là không bao giờ nhàn rỗi từ khía cạnh Espresso, bởi vì các hàng đợi thông điệp luôn luôn chứa một sự kiện được lên kế hoạch để xử lý chặt chẽ hơn so với ngưỡng sử dụng để xác định xem chủ đề là nhàn rỗi.

Khi bạn xem QueueInterrogator, bạn có thể thấy rằng đó là determineQueueState() trả về TASK_DUE_SOON khi hàng đợi tin nhắn chứa sự kiện được lên lịch để xử lý trong chưa đầy 16ms. UiController sẽ chỉ tiếp tục thực hiện khi tất cả các điều kiện nhàn rỗi được đáp ứng, trong trường hợp QueueInterrogator đây chỉ là trường hợp nếu hàng đợi tin nhắn trống hoặc tin nhắn tiếp theo được lên lịch để xử lý trong 16ms hoặc sau đó.

Hoạt ảnh sẽ làm mất hiệu lực số View chúng đang chuyển đổi và điều này sẽ kích hoạt phân cấp chế độ xem mới đi ngang qua Choreographer. Và thông báo kích hoạt này xuất phát từ ViewRoot đến Choreographer là những gì đang giữ cho hàng đợi tin nhắn của chuỗi giao diện người dùng của bạn không hoạt động.

+0

Cảm ơn bạn đã điều tra chi tiết. Tôi đã đi đến kết luận rằng điều này là đúng;) Thật thú vị, thay đổi hình động của tôi từ việc sử dụng "Khung hình hoạt hình" cho Animator người ta đã loại bỏ vấn đề. Bây giờ tôi có vấn đề nghịch đảo mà tôi không thể yêu cầu Espresso đợi một số hình ảnh động khác (hữu hạn) kết thúc trước khi tiếp tục với các đánh giá :) Tôi vẫn phải thực hiện một cách để vô hiệu hóa hoạt ảnh cho các bài kiểm tra (Espresso). Cảm ơn! – siger

Các vấn đề liên quan