Espresso-Intents เป็นส่วนขยายของ Espresso ซึ่งสามารถทำการตรวจสอบและ ความตั้งใจที่ส่งมาโดย แอปพลิเคชันอยู่ระหว่างการทดสอบ คล้ายกับ Mockito แต่สำหรับ Android Intent
หากแอปมอบสิทธิ์ฟังก์ชันให้กับแอปอื่นๆ หรือแพลตฟอร์ม คุณสามารถใช้ Espresso-Intents จะให้ความสำคัญกับตรรกะของแอปคุณเอง ในขณะเดียวกันก็สันนิษฐานว่าแอปอื่นๆ หรือแพลตฟอร์ม จะทำงานได้อย่างถูกต้อง ด้วย Espresso-Intents คุณสามารถจับคู่ และตรวจสอบ Intent ขาออกของคุณ หรือแม้กระทั่งให้ stub แทน การตอบสนองตามความตั้งใจจริง
รวม Espresso-Intent ไว้ในโปรเจ็กต์ของคุณ
เพิ่มบรรทัดต่อไปนี้ในไฟล์ app/build.gradle
ของแอป
dependencies
:
ดึงดูด
androidTestImplementation 'androidx.test.espresso:espresso-intents:3.6.1'
Kotlin
androidTestImplementation('androidx.test.espresso:espresso-intents:3.6.1')
Espresso-Intents สามารถใช้ได้เฉพาะกับ Espresso 2.1 ขึ้นไป และรุ่น 0.3 ขึ้นไป ของ ไลบรารีการทดสอบ Android ดังนั้นโปรดตรวจสอบว่าคุณได้อัปเดตบรรทัดเหล่านั้นด้วย ดังนี้
ดึงดูด
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')
เขียนกฎการทดสอบ
ให้ตั้งค่า IntentsTestRule
ก่อนที่จะเขียนการทดสอบ Espresso-Intents นี่คือ
ของคลาส ActivityTestRule
และทำให้ใช้งานง่าย
Espresso-Intent API ในการทดสอบ UI การทำงาน IntentsTestRule
เริ่มต้น
Espresso-Intent ก่อนการทดสอบแต่ละครั้งมีคำอธิบายประกอบด้วย @Test
และรุ่น
Espresso-Intents หลังทำการทดสอบแต่ละครั้ง
ข้อมูลโค้ดต่อไปนี้เป็นตัวอย่างของ IntentsTestRule
Kotlin
@get:Rule val intentsTestRule = IntentsTestRule(MyActivity::class.java)
Java
@Rule public IntentsTestRule<MyActivity> intentsTestRule = new IntentsTestRule<>(MyActivity.class);
การจับคู่ที่ตรงกัน
Espresso-Intents มอบความสามารถในการสกัดกั้นความตั้งใจขาออกโดยพิจารณาจาก เกณฑ์การจับคู่บางเกณฑ์ ซึ่งกำหนดโดยใช้ Hamcrest Matchers แฮมเครสต์ ช่วยให้คุณทำสิ่งต่อไปนี้ได้
- ใช้เครื่องมือจับคู่ Intent ที่มีอยู่: ตัวเลือกที่ง่ายที่สุดซึ่งควรใช้เสมอ เป็นตัวเลือกเพิ่มเติม
- ใช้ตัวจับคู่ Intent ของคุณเอง: ตัวเลือกที่ยืดหยุ่นที่สุด รายละเอียดเพิ่มเติมมีดังนี้ มีอยู่ในส่วนที่ชื่อ "การเขียนตัวจับคู่ที่กำหนดเอง" ภายใน บทแนะนำเกี่ยวกับ Hamcrest
Espresso-Intents มี intended()
และ intending()
วิธีการตรวจสอบ Intent และ
การค่อยๆ เสียดสี ตามลำดับ ทั้งสองนำออบเจ็กต์ Matcher<Intent>
ของ Hamcrest เป็น
อาร์กิวเมนต์
ข้อมูลโค้ดต่อไปนี้แสดงการตรวจสอบ Intent ที่ใช้ Intent ที่มีอยู่ ตัวจับคู่ที่ตรงกับ Intent ขาออกที่เริ่มต้นเบราว์เซอร์:
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");
ตรวจสอบ Intent
Espresso-Intents จะบันทึก Intent ทั้งหมดที่พยายามเปิดใช้งานกิจกรรมจาก
แอปพลิเคชันอยู่ระหว่างการทดสอบ การใช้เมธอด intended()
ซึ่งคล้ายกับ
Mockito.verify()
คุณยืนยันว่าผู้ใช้เห็นเจตนาแล้ว อย่างไรก็ตาม
Espresso-Intent จะไม่สร้างคำตอบจาก Intent นอกเสียจากคุณจะกำหนดค่าอย่างชัดแจ้ง
ให้ทำเช่นนั้นได้
ข้อมูลโค้ดต่อไปนี้เป็นตัวอย่างการทดสอบที่ตรวจสอบความถูกต้อง แต่ไม่ยึดติด ตอบสนองต่อ Intent ขาออกที่จะเปิด "โทรศัพท์" ภายนอก กิจกรรม:
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")); }
ขัดสี
เมื่อใช้เมธอด intending()
ซึ่งคล้ายกับ Mockito.when()
คุณสามารถ
ให้คำตอบต้นขั้วสำหรับกิจกรรมที่เปิดตัวด้วย
startActivityForResult()
วิธีนี้เหมาะอย่างยิ่งสำหรับกิจกรรมภายนอก
เนื่องจากคุณไม่สามารถเปลี่ยนแปลงอินเทอร์เฟซผู้ใช้ของกิจกรรมภายนอก หรือ
ควบคุม ActivityResult
ที่กลับไปยังกิจกรรมที่อยู่ระหว่างการทดสอบ
ข้อมูลโค้ดต่อไปนี้ใช้ตัวอย่าง
activityResult_DisplaysContactsPhoneNumber()
ซึ่งยืนยันว่าเมื่อ
ผู้ใช้เปิด "รายชื่อติดต่อ" กิจกรรมในแอปที่อยู่ระหว่างการทดสอบ
ตัวเลขที่แสดงคือ
สร้างผลลัพธ์เพื่อแสดงผลเมื่อมีกิจกรรมใดกิจกรรมหนึ่งเริ่มทำงาน ตัวอย่างการทดสอบสกัดกั้น Intent ทั้งหมดที่ส่งไปยัง "รายชื่อติดต่อ" และหักลบ การตอบกลับที่มี
ActivityResult
ที่ถูกต้องโดยใช้รหัสผลลัพธ์ วันที่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);
สั่งให้ Espresso จัดเตรียมออบเจ็กต์ผลลัพธ์ Stub เพื่อตอบสนองต่อ คำขอของ "รายชื่อติดต่อ" ความตั้งใจ:
Kotlin
intending(toPackage("com.android.contacts")).respondWith(result)
Java
intending(toPackage("com.android.contacts")).respondWith(result);
ตรวจสอบว่าการทำงานที่ใช้ในการเปิดกิจกรรมทำให้เกิดผลลัพธ์ ผลลัพธ์ต้นขั้ว ในกรณีนี้ การทดสอบตัวอย่างจะตรวจสอบว่าหมายเลขโทรศัพท์ "123-345-6789" ถูกส่งคืนและ แสดงเมื่อ "กิจกรรมรายชื่อติดต่อ" เปิดตัว:
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)));
ต่อไปนี้คือการทดสอบ activityResult_DisplaysContactsPhoneNumber()
ที่สมบูรณ์
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))); }
แหล่งข้อมูลเพิ่มเติม
หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับการใช้ Espresso-Intent ในการทดสอบ Android โปรดไปที่ แหล่งข้อมูลต่อไปนี้
ตัวอย่าง
- IntentsBasicSample:
การใช้งานพื้นฐานของ
intended()
และintending()
- IntentsAdvancedSample: จำลองผู้ใช้ที่ดึงบิตแมปโดยใช้กล้อง