เอสเพรสโซ่-ความตั้งใจ

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() ซึ่งยืนยันว่าเมื่อ ผู้ใช้เปิด "รายชื่อติดต่อ" กิจกรรมในแอปที่อยู่ระหว่างการทดสอบ ตัวเลขที่แสดงคือ

  1. สร้างผลลัพธ์เพื่อแสดงผลเมื่อมีกิจกรรมใดกิจกรรมหนึ่งเริ่มทำงาน ตัวอย่างการทดสอบสกัดกั้น 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);
    
  2. สั่งให้ Espresso จัดเตรียมออบเจ็กต์ผลลัพธ์ Stub เพื่อตอบสนองต่อ คำขอของ "รายชื่อติดต่อ" ความตั้งใจ:

    Kotlin

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

    Java

    intending(toPackage("com.android.contacts")).respondWith(result);
    
  3. ตรวจสอบว่าการทำงานที่ใช้ในการเปิดกิจกรรมทำให้เกิดผลลัพธ์ ผลลัพธ์ต้นขั้ว ในกรณีนี้ การทดสอบตัวอย่างจะตรวจสอบว่าหมายเลขโทรศัพท์ "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: จำลองผู้ใช้ที่ดึงบิตแมปโดยใช้กล้อง