Espresso-Intents

Espresso-Intents là một phần mở rộng của Espresso, giúp xác thực và loại bỏ ý định do đang được kiểm tra. Giống như Mockito, nhưng dành cho ý định Android.

Nếu ứng dụng của bạn uỷ quyền chức năng cho các ứng dụng khác hoặc nền tảng, thì bạn có thể sử dụng Espresso-Intents tập trung vào logic của ứng dụng trong khi giả định rằng các ứng dụng khác hoặc nền tảng sẽ hoạt động chính xác. Với Espresso-Intents, bạn có thể so khớp và xác thực các ý định gửi đi hay thậm chí là cung cấp các phản hồi giả lập thay cho phản hồi ý định thực tế.

Đưa Espresso-Intents vào dự án

Trong tệp app/build.gradle của ứng dụng, hãy thêm dòng sau vào bên trong dependencies:

Groovy

androidTestImplementation 'androidx.test.espresso:espresso-intents:3.6.1'

Kotlin

androidTestImplementation('androidx.test.espresso:espresso-intents:3.6.1')

Espresso-Intents chỉ tương thích với Espresso 2.1 trở lên và phiên bản 0.3 trở lên của Thư viện kiểm thử Android, vì vậy, đừng quên cập nhật cả những dòng đó:

Groovy

androidTestImplementation 'androidx.test:runner:1.6.1'
androidTestImplementation 'androidx.test:rules:1.6.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'

Kotlin

androidTestImplementation('androidx.test:runner:1.6.1')
androidTestImplementation('androidx.test:rules:1.6.1')
androidTestImplementation('androidx.test.espresso:espresso-core:3.6.1')

Viết quy tắc kiểm thử

Trước khi viết kiểm thử Espresso-Intents, hãy thiết lập một IntentsTestRule. Đây là một là một phần mở rộng của lớp ActivityTestRule và giúp bạn dễ dàng sử dụng API Espresso-Intents trong các bài kiểm thử chức năng trên giao diện người dùng. IntentsTestRule sẽ khởi chạy Espresso-Intents trước mỗi lần kiểm thử được chú thích bằng @Test và các bản phát hành Espresso-Intent sau mỗi lần chạy kiểm thử.

Đoạn mã sau đây là một ví dụ về IntentsTestRule:

Kotlin

@get:Rule
val intentsTestRule = IntentsTestRule(MyActivity::class.java)

Java

@Rule
public IntentsTestRule<MyActivity> intentsTestRule =
    new IntentsTestRule<>(MyActivity.class);

Trùng khớp

Espresso-Intents cung cấp khả năng chặn lại các ý định gửi đi dựa trên tiêu chí so khớp nhất định được xác định bằng Hamcrest Matchers. Tựa lưng cho phép bạn:

  • Sử dụng trình so khớp ý định hiện có: Lựa chọn dễ nhất, hầu như luôn phải đáp ứng được ưu tiên.
  • Triển khai trình so khớp ý định của riêng bạn: Lựa chọn linh hoạt nhất. Các chi tiết khác là có sẵn trong mục có tiêu đề "Viết trình so khớp tuỳ chỉnh" trong Hướng dẫn về Hamcrest.

Espresso-Intents cung cấp intended()intending() để xác thực ý định và đầu tiên. Cả hai đều lấy đối tượng Hamcrest Matcher<Intent> làm đối tượng đối số.

Đoạn mã sau đây cho thấy cách xác thực ý định sử dụng ý định hiện tại trình so khớp khớp với một ý định đi mà khởi động trình duyệt:

Kotlin

assertThat(intent).hasAction(Intent.ACTION_VIEW)
assertThat(intent).categories().containsExactly(Intent.CATEGORY_BROWSABLE)
assertThat(intent).hasData(Uri.parse("www.google.com"))
assertThat(intent).extras().containsKey("key1")
assertThat(intent).extras().string("key1").isEqualTo("value1")
assertThat(intent).extras().containsKey("key2")
assertThat(intent).extras().string("key2").isEqualTo("value2")

Java

assertThat(intent).hasAction(Intent.ACTION_VIEW);
assertThat(intent).categories().containsExactly(Intent.CATEGORY_BROWSABLE);
assertThat(intent).hasData(Uri.parse("www.google.com"));
assertThat(intent).extras().containsKey("key1");
assertThat(intent).extras().string("key1").isEqualTo("value1");
assertThat(intent).extras().containsKey("key2");
assertThat(intent).extras().string("key2").isEqualTo("value2");

Xác thực ý định

Espresso-Intents ghi lại tất cả ý định cố gắng khởi chạy các hoạt động từ đang được kiểm tra. Sử dụng phương thức intended(), tương tự như Mockito.verify(), bạn có thể xác nhận rằng một ý định nhất định đã được nhìn thấy. Tuy nhiên, Espresso-Intent không giả lập phản hồi cho ý định, trừ phi bạn định cấu hình một cách rõ ràng để làm điều đó.

Đoạn mã sau đây là một ví dụ về kiểm thử giúp xác thực, nhưng không phải mã giả lập phản hồi cho, một ý định đi chạy một "điện thoại" bên ngoài hoạt động:

Kotlin

@Test fun validateIntentSentToPackage() {
    // User action that results in an external "phone" activity being launched.
    user.clickOnView(system.getView(R.id.callButton))

    // Using a canned RecordedIntentMatcher to validate that an intent resolving
    // to the "phone" activity has been sent.
    intended(toPackage("com.android.phone"))
}

Java

@Test
public void validateIntentSentToPackage() {
    // User action that results in an external "phone" activity being launched.
    user.clickOnView(system.getView(R.id.callButton));

    // Using a canned RecordedIntentMatcher to validate that an intent resolving
    // to the "phone" activity has been sent.
    intended(toPackage("com.android.phone"));
}

Rụng lông

Khi sử dụng phương thức intending(), tương tự như Mockito.when(), bạn có thể cung cấp phản hồi giả lập cho các hoạt động được khởi chạy bằng startActivityForResult(). Điều này đặc biệt hữu ích đối với các hoạt động bên ngoài vì bạn không thể thao tác trên giao diện người dùng của một hoạt động bên ngoài hoặc kiểm soát ActivityResult được trả về hoạt động đang được kiểm thử.

Các đoạn mã sau đây triển khai một ví dụ activityResult_DisplaysContactsPhoneNumber(), xác minh rằng khi một người dùng bắt đầu một "thông tin liên hệ" hoạt động trong ứng dụng đang được kiểm tra, điện thoại liên hệ số được hiển thị:

  1. Tạo kết quả để trả về khi một hoạt động cụ thể được khởi chạy. Chiến lược phát hành đĩa đơn kiểm thử mẫu chặn tất cả Ý định gửi tới "người liên hệ" và ấp ủ phản hồi có ActivityResult hợp lệ, sử dụng mã kết quả RESULT_OK

    Kotlin

    val resultData = Intent()
    val phoneNumber = "123-345-6789"
    resultData.putExtra("phone", phoneNumber)
    val result = Instrumentation.ActivityResult(Activity.RESULT_OK, resultData)
    

    Java

    Intent resultData = new Intent();
    String phoneNumber = "123-345-6789";
    resultData.putExtra("phone", phoneNumber);
    ActivityResult result =
        new ActivityResult(Activity.RESULT_OK, resultData);
    
  2. Hướng dẫn Espresso cung cấp đối tượng kết quả mã giả lập để phản hồi tất cả lời gọi của "địa chỉ liên hệ" ý định:

    Kotlin

    intending(toPackage("com.android.contacts")).respondWith(result)
    

    Java

    intending(toPackage("com.android.contacts")).respondWith(result);
    
  3. Xác minh rằng thao tác dùng để chạy hoạt động đó tạo ra kết quả mong đợi kết quả giả lập. Trong trường hợp này, thử nghiệm mẫu sẽ kiểm tra xem số điện thoại "123-345-6789" được trả về và được hiển thị khi "hoạt động của danh bạ" được chạy:

    Kotlin

    onView(withId(R.id.pickButton)).perform(click())
    onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber)))
    

    Java

    onView(withId(R.id.pickButton)).perform(click());
    onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber)));
    

Dưới đây là quy trình kiểm thử activityResult_DisplaysContactsPhoneNumber() hoàn chỉnh:

Kotlin

@Test fun activityResult_DisplaysContactsPhoneNumber() {
    // Build the result to return when the activity is launched.
    val resultData = Intent()
    val phoneNumber = "123-345-6789"
    resultData.putExtra("phone", phoneNumber)
    val result = Instrumentation.ActivityResult(Activity.RESULT_OK, resultData)

    // Set up result stubbing when an intent sent to "contacts" is seen.
    intending(toPackage("com.android.contacts")).respondWith(result)

    // User action that results in "contacts" activity being launched.
    // Launching activity expects phoneNumber to be returned and displayed.
    onView(withId(R.id.pickButton)).perform(click())

    // Assert that the data we set up above is shown.
    onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber)))
}

Java

@Test
public void activityResult_DisplaysContactsPhoneNumber() {
    // Build the result to return when the activity is launched.
    Intent resultData = new Intent();
    String phoneNumber = "123-345-6789";
    resultData.putExtra("phone", phoneNumber);
    ActivityResult result =
        new ActivityResult(Activity.RESULT_OK, resultData);

    // Set up result stubbing when an intent sent to "contacts" is seen.
    intending(toPackage("com.android.contacts")).respondWith(result);

    // User action that results in "contacts" activity being launched.
    // Launching activity expects phoneNumber to be returned and displayed.
    onView(withId(R.id.pickButton)).perform(click());

    // Assert that the data we set up above is shown.
    onView(withId(R.id.phoneNumber)).check(matches(withText(phoneNumber)));
}

Tài nguyên khác

Để biết thêm thông tin về cách sử dụng Espresso-Intents trong kiểm thử Android, hãy tham khảo các tài nguyên sau.

Mẫu