13

1) Tất cả các thiết bị/trình mô phỏng đang được thử nghiệm đều tắt hoạt ảnh.Flaky Android Espresso Test - Snackbar

2) Tôi có @BeforeClass tạo đối tượng Thông tin xác thực của tôi.

3) Tôi có IntenServiceIdlingResource và EventBusIdlingResource, đã đăng ký trong @Trước.

4) Khi nút đăng nhập được nhấp, IntentService sẽ tắt. Trong trường hợp này, máy chủ (một máy chủ giả lập) đang trả về lỗi 500. Thông tin đó được đăng trở lại giao diện người dùng từ IntentService, thông qua EventBus của greenrobot và một Snackbar được hiển thị cùng với thông báo lỗi.

Dưới đây là đoạn code cho kỳ thi này:

@Test 
public void a_userNamePasswordTest() throws Exception { 
    // email input 
    ViewInteraction userNameView = onView(withId(R.id.email)); 

    // verify it's on screen and enabled 
    userNameView.check(matches(isDisplayed())).check(matches(isEnabled())); 

    // set the username 
    userNameView.perform(scrollTo(), replaceText(credentials.username), closeSoftKeyboard()); 

    // password input 
    ViewInteraction passwordView = onView(withId(R.id.password)); 

    // verify it's on screen and enabled 
    passwordView.check(matches(isDisplayed())).check(matches(isEnabled())); 

    // set the password. 
    passwordView.perform(scrollTo(), replaceText(credentials.password), closeSoftKeyboard()); 

    // sign in button 
    ViewInteraction signInButton = onView(withId(R.id.email_sign_in_button)); 

    // verify the button 
    signInButton.check(matches(allOf(
      isDisplayed(), isEnabled(), withText("Sign In"), withContentDescription("Sign In") 
    ))); 

    // clickity click the button 
    signInButton.perform(scrollTo(), click()); 

    // verify the snackbar text 
    onView(withText(startsWith("Server Error: 500"))).check(matches(isDisplayed())); 

} 

Đây là ngoại lệ tôi thường nhận được:

SignInExceptionTest > a_userNamePasswordTest[Nexus_6P_API_23(AVD) - 6.0] FAILED android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with text: a string starting with "Server Error: 500"

Theo ghi chép của tôi, tài nguyên idling tôi đang làm việc. Nhưng nhìn vào dấu thời gian cho nhật ký, ngoại lệ xảy ra khoảng 5 giây sau khi tài nguyên không hoạt động đã không hoạt động.

Dường như có sự chậm trễ giữa thời điểm tài nguyên không hoạt động và khi cố gắng tìm kiếm chế độ xem.

chi tiết có thể thích hợp khác:

  • minSdk: 20
  • biên dịch & targetSdk: 25
  • buildTools: 25.0.2
  • hỗ trợ thư viện: 25.1.1
  • espresso-core : 2.2.2
  • plugin gradle 2.3.0-beta3

Làm cách nào tôi có thể khắc phục thử nghiệm này để thử nghiệm không bị bong bóng, bên cạnh việc tăng thời gian hiển thị các thanh snack của tôi?

Trả lời

12

Espresso thực thi thời gian chờ là 5 giây sau khi IdlingResource hoạt động trước khi được kiểm tra lại khi không hoạt động.

Điều này có 2 tác động tiêu cực trong trường hợp của tôi.

Đầu tiên, nó tăng thời gian chạy thử nghiệm. Thêm 5 giây (hoặc bội số của 5) trên mọi thử nghiệm thực sự có thể tăng lên.

Thứ hai, vì thanh snack được hiển thị ngay lập tức và chỉ hiển thị trong khoảng 3,5 giây, bất kỳ lúc nào bạn đang chờ IdlingResource, thanh snack sẽ biến mất trước khi Espresso nhận ra rằng tài nguyên không hoạt động, gây khó khăn cho bạn để kiểm tra.

ConditionWatcher, được mô tả ở đây: https://medium.com/azimolabs/wait-for-it-idlingresource-and-conditionwatcher-602055f32356#.9rms52osh

Và mã ở đây: https://github.com/AzimoLabs/ConditionWatcher

Cung cấp một giải pháp cho cả hai vấn đề này. Thay vì 5 giây, giá trị mặc định là 250ms và giá trị này có thể được điều chỉnh (setWatchInterval).

+0

CẢM ƠN BẠN. Sự phụ thuộc của Espresso vào IdlingResource đã khiến tôi bị chuối. Không có lý do chính đáng nào để đưa mã khung kiểm thử vào các lớp của tôi, và đây là cách nó nên được thực hiện đúng cách. Tôi vẫn không thể tin rằng Espresso không có thứ như thế này! –

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