एस्प्रेसो-इंटेंट

Espresso-Intents, Espresso का एक एक्सटेंशन है. यह, पुष्टि करने की प्रक्रिया को चालू करता है और ईमेल के ज़रिए भेजे गए इंटेंट के स्टबिंग आवेदन की जांच की जा रही है. यह ऐसा है मॉकिटो, लेकिन Android इंटेंट के लिए.

अगर आपका ऐप्लिकेशन, अन्य ऐप्लिकेशन या प्लैटफ़ॉर्म की सुविधाओं को ऐक्सेस करता है, तो यह मानते हुए कि दूसरे ऐप्लिकेशन, आपके ऐप्लिकेशन के लॉजिक पर फ़ोकस करते हैं, एस्प्रेसो इंटेंट नहीं तो प्लैटफ़ॉर्म सही तरीके से काम करेगा. एस्प्रेसो-इंटेंट के ज़रिए और आपके जाने वाले इंटेंट की पुष्टि कर सके या इसकी जगह स्टब जवाब दे इंटेंट के आधार पर जवाब.

अपने प्रोजेक्ट में एस्प्रेसो इंटेंट शामिल करें

अपने ऐप्लिकेशन की 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 सेट अप करें. यह है क्लास ActivityTestRule का एक्सटेंशन और इसे इस्तेमाल करना आसान बनाता है फ़ंक्शनल यूज़र इंटरफ़ेस (यूआई) टेस्ट में Espresso-Intents एपीआई. IntentsTestRule शुरू होता है @Test और रिलीज़ के साथ एनोटेट किए गए हर टेस्ट से पहले एस्प्रेसो-इंटेंट हर टेस्ट रन के बाद, एस्प्रेसो इंटेंट.

यह कोड स्निपेट, IntentsTestRule का उदाहरण है:

Kotlin

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

Java

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

मिलता-जुलता

एस्प्रेसो-इंटेंट कुछ मिलान मानदंड, जिन्हें हैमक्रेस्ट मैचर का उपयोग करके परिभाषित किया जाता है. हैमक्रेस्ट इसकी मदद से:

  • किसी मौजूदा इंटेंट मैचर का इस्तेमाल करें: सबसे आसान विकल्प, जो करीब-करीब हमेशा प्राथमिकता दी जाएगी.
  • अपना खुद का इंटेंट मैचर लागू करें: सबसे सुविधाजनक विकल्प. ज़्यादा जानकारी यहां दी गई है "कस्टम मैचर लिखना" सेक्शन में उपलब्ध है के अंदर Hamcrest ट्यूटोरियल.

एस्प्रेसो-इंटेंट intended() की सुविधा देता है और इंटेंट की पुष्टि करने के लिए intending() तरीके और स्टबिंग करते हैं. दोनों, एक हैमक्रेस्ट Matcher<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");

इंटेंट की पुष्टि करें

Espresso-Intents, उन सभी इंटेंट को रिकॉर्ड करता है जो आवेदन की जांच की जा रही है. intended() तरीके का इस्तेमाल करना. यह तरीका इससे मिलता-जुलता है Mockito.verify() के ज़रिए, आपके पास दावा करने का विकल्प है कि आपका तय किया गया इंटेंट देख लिया गया है. हालांकि, एस्प्रेसो-इंटेंट, इंटेंट के जवाबों को तब तक नहीं रोकता, जब तक कि आप साफ़ तौर पर कॉन्फ़िगर न कर दें आपको नहीं करना है.

यह कोड स्निपेट एक उदाहरण के तौर पर दिया गया टेस्ट है, जो पुष्टि करता है, लेकिन स्टब नहीं करता बाहरी "फ़ोन" लॉन्च करने पर, जाने वाला इंटेंट हो गतिविधि:

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"));
}

स्टबिंग

Mockito.when() से मिलते-जुलते intending() तरीके का इस्तेमाल करके, ये काम किए जा सकते हैं इनके साथ लॉन्च की जाने वाली गतिविधियों के लिए स्टब रिस्पॉन्स देते हों startActivityForResult(). यह खास तौर पर बाहरी गतिविधियों के लिए फ़ायदेमंद है क्योंकि बाहरी गतिविधि के यूज़र इंटरफ़ेस में न तो बदलाव किया जा सकता है और न ही ActivityResult को टेस्ट की जा रही गतिविधि पर वापस लाया जा सकता है.

यहां दिए गए कोड स्निपेट, एक उदाहरण लागू करते हैं activityResult_DisplaysContactsPhoneNumber() टेस्ट करता है, जो पुष्टि करता है कि जब जब कोई व्यक्ति "संपर्क" लॉन्च करता है ऐप्लिकेशन में की गई गतिविधि, जिसकी जांच की जा रही है. नंबर प्रदर्शित है:

  1. कोई खास गतिविधि लॉन्च होने पर, नतीजे के तौर पर दिखाएं. कॉन्टेंट बनाने उदाहरण के लिए, टेस्ट "contacts" को भेजे गए सभी इंटेंट को इंटरसेप्ट करता है और स्टंट की मदद से अपने नतीजे के कोड का इस्तेमाल करके, मान्य 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 को निर्देश दें कि वह सभी क्वेरी के जवाब में स्टब रिज़ल्ट ऑब्जेक्ट उपलब्ध कराए "संपर्कों" का इस्तेमाल इंटेंट:

    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)));
}

अन्य संसाधन

Android टेस्ट में Espresso-Intents का इस्तेमाल करने के बारे में ज़्यादा जानकारी के लिए, के लिए संसाधन उपलब्ध हैं.

सैंपल

  • IntentsBasicSample: intended() और intending() का सामान्य इस्तेमाल.
  • IntentsAdvancedSample: यह सिम्युलेट करता है कि कोई उपयोगकर्ता कैमरे का इस्तेमाल करके बिट मैप फ़ेच कर रहा है.