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()
và 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ị:
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à dành riêng cho bản thân 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);
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);
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
- IntentBasicSample:
Cách sử dụng cơ bản của
intended()
vàintending()
. - IntentAdvancedSample: Mô phỏng một người dùng tìm nạp bitmap bằng máy ảnh.