2015-06-16 18 views
9

Chúng tôi có một vài bài kiểm tra giao diện người dùng xung quanh chức năng máy ảnh của chúng tôi và sau khi chúng tôi thực hiện chuyển đổi từ InstrumentationTestRunner sang AndroidJUnitRunner như một phần của việc chuyển sang Espresso/JUnit4, chúng tôi không thể chạy nữa kiểm tra hiện đáng tin cậy do RuntimeException thường xuyên khi chúng ta gọi là getActivity():Thử nghiệm giao diện người dùng Android hiện có đã ngừng hoạt động sau khi chuyển sang AndroidJUnitRunner

java.lang.RuntimeException: Could not launch intent Intent { flg=0x14000000 cmp=com.cookbrite.dev/com.cookbrite.ui.ReceiptCaptureActivity (has extras) } within 45 seconds. Perhaps the main thread has not gone idle within a reasonable amount of time? There could be an animation or something constantly repainting the screen. Or the activity is doing network calls on creation? See the threaddump logs. For your reference the last time the event queue was idle before your activity launch request was 1434471981236 and now the last time the queue went idle was: 1434471981236. If these numbers are the same your activity might be hogging the event queue. 
at android.support.test.runner.MonitoringInstrumentation.startActivitySync(MonitoringInstrumentation.java:315) 
at android.test.InstrumentationTestCase.launchActivityWithIntent(InstrumentationTestCase.java:119) 
at android.test.ActivityInstrumentationTestCase2.getActivity(ActivityInstrumentationTestCase2.java:106) 
at com.cookbrite.step2_functional.ui.receipt.ReceiptCaptureTest.getActivity(ReceiptCaptureTest.java:43) 

Đối readibility tốt hơn, đây là thông báo lỗi trên RuntimeException như một báo:

không thể khởi chạy ý định ý định {FLG = 0x14000000 cmp = com.cookbrite.dev/com.cookbrite.ui.ReceiptCaptureActivity (có tính năng bổ sung)} trong vòng 45 giây. Có lẽ chủ đề chính đã không bị nhàn rỗi trong một khoảng thời gian hợp lý? Có thể có hoạt ảnh hoặc thứ gì đó liên tục sơn lại màn hình. Hoặc hoạt động đang thực hiện cuộc gọi mạng khi tạo? Xem nhật ký threaddump. Để bạn tham khảo lần cuối cùng hàng đợi sự kiện không hoạt động trước khi hoạt động của bạn khởi chạy yêu cầu là 1434471981236 và giờ là lần cuối hàng đợi không hoạt động là: 1434471981236. Nếu các số này giống hoạt động của bạn có thể đang hoán đổi hàng sự kiện.

Thử nghiệm hiện tại của chúng tôi sử dụng Robotium. Một nỗ lực để viết cùng một thử nghiệm bằng cách sử dụng Espresso mang lại lỗi tương tự, có thể do xem trước máy ảnh liên tục cập nhật giao diện người dùng. Tuy nhiên, ngay cả khi xem trước được đặt thành INVISIBLE, chúng tôi vẫn gặp sự cố này với Espresso.

Bất kỳ ý tưởng/con trỏ nào về cách sửa lỗi này (ngoài quay lại InstrumentationTestRunner)?

+0

kiểm tra robotium chạy tốt khi bạn đặt xem trước thành INVISIBLE hoặc GONE – user2511882

+0

kiểm tra Robotium của tôi vẫn không thành công với cùng một RuntimeException khi đánh giá được đặt thành INVISIBLE. – Yenchi

+0

ok .. chúng tôi đã trải qua điều này trước ... trong trường hợp của chúng tôi đó là vì chúng tôi đã sử dụng để khởi chạy các hoạt động mới trên mỗi lần nhấp nút .. và kết quả là roboitum sẽ konk ra .. chúng tôi đã phải giết tất cả các hoạt động trong tearDown .. – user2511882

Trả lời

0

Cuối cùng, chúng ta thay đổi giao diện người dùng để trì hoãn camera preview khởi động để MonitoringInstrumentation không nhận được khó chịu với tất cả các bản cập nhật giao diện người dùng. Ngoài ra, cả hai SurfaceViewTextureView cập nhật giao diện người dùng sau khi máy ảnh được kết nối, ngay cả ở trạng thái INVISIBLE hoặc GONE. Đó là nguyên nhân gây ra MonitoringInstrumentation để từ bỏ trong trường hợp của chúng tôi.

Nếu bạn có bài kiểm tra bắt đầu với cập nhật giao diện người dùng không đổi, bạn có thể muốn xem xét tạm dừng hành động cho đến khi startActivitySync() kết thúc và bạn nhận được kết quả không null từ getActivity().

0

Đầu ra lỗi cho biết lớp thử nghiệm mở rộng ActivityInstrumentationTestCase2. Tôi không chắc chắn liệu di chuyển đến ActivityTestRule mới sẽ tạo ra bất kỳ sự khác biệt nào trong trường hợp của bạn, nhưng nó đáng để kiểm tra nhanh. Đưa này trong một câu trả lời chứ không phải là một lời nhận xét để bao gồm mẫu mã:

@RunWith(AndroidJUnit4.class) 
public class ReceiptCaptureTestNew { 
    private ReceiptCaptureActivity mReceiptCaptureActivity; 

    @Rule 
    public ActivityTestRule<mReceiptCaptureActivity> mActivityRule = 
      new ActivityTestRule<>(mReceiptCaptureActivity.class); 

    @Before 
    public void setUp() throws Exception { 
     mReceiptCaptureActivity = mActivityRule.getActivity(); 
    } 

    @After 
    public void tearDown() throws Exception { 
     // Call finish() on all activities in @After to avoid exceptions in 
     // later calls to getActivity() in subsequent tests 
     mReceiptCaptureActivity.finish(); 
    } 

    @Test 
    public void testPreconditions() { 
     assertNotNull(mReceiptCaptureActivity); 
     assertThat(mReceiptCaptureActivity.hasWindowFocus(), is(true)); 
    } 
} 
+0

Thật không may khi tôi viết cùng một bài kiểm tra trong Espresso, tôi đã sử dụng ActivityRule + Junit4Runner và tôi nhận được kết quả tương tự. Nhưng cảm ơn câu trả lời! – Yenchi

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