এসপ্রেসো-ইন্টেন্টস

Espresso-Intents হল Espresso-এর একটি এক্সটেনশন, যা পরীক্ষার অধীনে আবেদনের মাধ্যমে পাঠানো ইন্টেন্টের বৈধতা এবং স্টাবিং সক্ষম করে। এটা Mockito এর মত, কিন্তু Android Intents এর জন্য।

যদি আপনার অ্যাপ অন্য অ্যাপ বা প্ল্যাটফর্মে কার্যকারিতা অর্পণ করে, তাহলে অন্য অ্যাপ বা প্ল্যাটফর্ম সঠিকভাবে কাজ করবে বলে অনুমান করে আপনি নিজের অ্যাপের যুক্তিতে ফোকাস করতে Espresso-Intents ব্যবহার করতে পারেন। Espresso-Intents-এর সাথে, আপনি আপনার বহির্গামী অভিপ্রায়গুলিকে মেলাতে এবং যাচাই করতে পারেন বা এমনকি প্রকৃত অভিপ্রায় প্রতিক্রিয়াগুলির জায়গায় স্টাব প্রতিক্রিয়াগুলি প্রদান করতে পারেন৷

আপনার প্রকল্পে Espresso-Intents অন্তর্ভুক্ত করুন

আপনার অ্যাপের app/build.gradle ফাইলে, dependencies ভিতরে নিম্নলিখিত লাইন যোগ করুন:

গ্রোভি

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

কোটলিন

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

Espresso-Intents শুধুমাত্র Espresso 2.1+ এবং Android টেস্টিং লাইব্রেরিগুলির 0.3+ সংস্করণের সাথে সামঞ্জস্যপূর্ণ, তাই নিশ্চিত করুন যে আপনি সেই লাইনগুলিও আপডেট করেছেন:

গ্রোভি

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

কোটলিন

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

পরীক্ষার নিয়ম লিখুন

একটি Espresso-Intents পরীক্ষা লেখার আগে, একটি IntentsTestRule সেট আপ করুন। এটি ActivityTestRule ক্লাসের একটি এক্সটেনশন এবং কার্যকরী UI পরীক্ষায় Espresso-Intents API ব্যবহার করা সহজ করে তোলে। একটি IntentsTestRule প্রতিটি পরীক্ষার আগে @Test এর সাথে টীকা লেখার আগে Espresso-Intents আরম্ভ করে এবং প্রতিটি পরীক্ষা চালানোর পরে Espresso-Intents প্রকাশ করে।

নিম্নলিখিত কোড স্নিপেট একটি IntentsTestRule এর উদাহরণ:

কোটলিন

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

জাভা

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

ম্যাচ

Espresso-Intents কিছু নির্দিষ্ট মানদণ্ডের উপর ভিত্তি করে বহির্গামী উদ্দেশ্যগুলিকে আটকানোর ক্ষমতা প্রদান করে, যা হ্যামক্রেস্ট ম্যাচার্স ব্যবহার করে সংজ্ঞায়িত করা হয়। হ্যামক্রেস্ট আপনাকে অনুমতি দেয়:

  • একটি বিদ্যমান অভিপ্রায় ম্যাচার ব্যবহার করুন: সবচেয়ে সহজ বিকল্প, যা প্রায় সবসময় পছন্দ করা উচিত।
  • আপনার নিজস্ব উদ্দেশ্য ম্যাচার প্রয়োগ করুন: সবচেয়ে নমনীয় বিকল্প। হ্যামক্রেস্ট টিউটোরিয়ালের মধ্যে "কাস্টম ম্যাচার লেখা" শিরোনামের বিভাগে আরও বিশদ পাওয়া যায়।

Espresso-Intents যথাক্রমে উদ্দেশ্য যাচাইকরণ এবং স্টাবিংয়ের জন্য intended() এবং intending() পদ্ধতি অফার করে। উভয়ই একটি যুক্তি হিসাবে একটি হ্যামক্রেস্ট Matcher<Intent> অবজেক্ট নেয়।

নিম্নলিখিত কোড স্নিপেটটি অভিপ্রায় যাচাই দেখায় যা বিদ্যমান অভিপ্রায় ম্যাচার ব্যবহার করে যা একটি বহির্গামী অভিপ্রায়ের সাথে মেলে যা একটি ব্রাউজার শুরু করে:

কোটলিন

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

জাভা

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() এর অনুরূপ, আপনি নিশ্চিত করতে পারেন যে একটি প্রদত্ত উদ্দেশ্য দেখা গেছে। যাইহোক, Espresso-Intents ইন্টেন্টগুলির প্রতিক্রিয়াগুলি বন্ধ করে না যদি না আপনি এটি করার জন্য স্পষ্টভাবে কনফিগার করেন

নিম্নলিখিত কোড স্নিপেট হল একটি উদাহরণ পরীক্ষা যা বৈধ করে, কিন্তু একটি বহিরাগত অভিপ্রায় যা একটি বহিরাগত "ফোন" কার্যকলাপ চালু করে তার প্রতিক্রিয়াগুলিকে আটকে দেয় না:

কোটলিন

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

জাভা

@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. একটি নির্দিষ্ট কার্যকলাপ চালু হলে ফিরে আসার জন্য ফলাফল তৈরি করুন। উদাহরণ পরীক্ষাটি "পরিচিতি"-এ প্রেরিত সমস্ত ইন্টেন্টকে বাধা দেয় এবং ফলাফল কোড RESULT_OK ব্যবহার করে একটি বৈধ ActivityResult সহ তাদের প্রতিক্রিয়াগুলি বাদ দেয়

    কোটলিন

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

    জাভা

    Intent resultData = new Intent();
    String phoneNumber = "123-345-6789";
    resultData.putExtra("phone", phoneNumber);
    ActivityResult result =
        new ActivityResult(Activity.RESULT_OK, resultData);
    
  2. এসপ্রেসোকে "পরিচিতি" অভিপ্রায়ের সমস্ত আহ্বানের প্রতিক্রিয়া হিসাবে স্টাব ফলাফল বস্তু প্রদান করার নির্দেশ দিন:

    কোটলিন

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

    জাভা

    intending(toPackage("com.android.contacts")).respondWith(result);
    
  3. যাচাই করুন যে ক্রিয়াকলাপ চালু করতে ব্যবহৃত ক্রিয়াটি প্রত্যাশিত স্টাব ফলাফল তৈরি করে। এই ক্ষেত্রে, উদাহরণ পরীক্ষা পরীক্ষা করে যে ফোন নম্বর "123-345-6789" ফেরত দেওয়া হয় এবং "পরিচিতি কার্যকলাপ" চালু হলে প্রদর্শিত হয়:

    কোটলিন

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

    জাভা

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

এখানে সম্পূর্ণ activityResult_DisplaysContactsPhoneNumber() পরীক্ষা আছে:

কোটলিন

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

জাভা

@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-Intents ব্যবহার সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত সংস্থানগুলি দেখুন৷

নমুনা

  • IntentsBasicSample : intended() এবং intending() এর মৌলিক ব্যবহার।
  • IntentsAdvancedSample : ক্যামেরা ব্যবহার করে একটি বিটম্যাপ আনা ব্যবহারকারীকে অনুকরণ করে।