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'
Kotlin
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'
Kotlin
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-এর একটি উদাহরণ:
Kotlin
@get:Rule val intentsTestRule = IntentsTestRule(MyActivity::class.java)
জাভা
@Rule public IntentsTestRule<MyActivity> intentsTestRule = new IntentsTestRule<>(MyActivity.class);
মিল
Espresso-Intents, নির্দিষ্ট কিছু ম্যাচিং মাপকাঠির ভিত্তিতে আউটগোয়িং ইনটেন্ট ইন্টারসেপ্ট করার ক্ষমতা প্রদান করে, যা Hamcrest Matchers ব্যবহার করে সংজ্ঞায়িত করা হয়। Hamcrest আপনাকে এগুলি করতে দেয়:
- আগে থেকে থাকা ইনটেন্ট ম্যাচ করার সুবিধা ব্যবহার করুন: সবচেয়ে সহজ বিকল্প, যা প্রায় সবসময় পছন্দ করা উচিত।
- আপনার নিজস্ব ইনটেন্ট ম্যাচিং সিস্টেম প্রয়োগ করুন: সবচেয়ে সুবিধাজনক বিকল্প। Hamcrest টিউটোরিয়াল-এর "কাস্টম ম্যাচিং লেখা" বিভাগে আরও তথ্য উপলভ্য।
Espresso-Intents, ইনটেন্ট যাচাইকরণ ও স্টাবিংয়ের জন্য যথাক্রমে
intended() এবং intending() পদ্ধতি
অফার করে। উভয়ই আর্গুমেন্ট হিসেবে Hamcrest 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")
জাভা
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 ইনটেন্টের উত্তর স্টাব আউট করে না, যদি না আপনি এটি করার জন্য স্পষ্টভাবে কনফিগার
করেন।
নিম্নলিখিত কোড স্নিপেট হল একটি উদাহরণ পরীক্ষা যা যাচাই করে, কিন্তু বাহ্যিক "ফোন" অ্যাক্টিভিটি চালু করে এমন একটি আউটগোয়িং ইনটেন্টের প্রতিক্রিয়া স্টাব আউট করে না:
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")) }
জাভা
@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() টেস্ট প্রয়োগ করে, যা যাচাই করে যে যখন একজন
ব্যবহারকারী টেস্টের অধীনে অ্যাপে একটি "পরিচিতি" অ্যাক্টিভিটি চালু করেন, তখন পরিচিতির ফোন
নম্বর দেখানো হয়:
কোনও নির্দিষ্ট অ্যাক্টিভিটি লঞ্চ করা হলে, ফলাফল দেখানোর জন্য সেটি তৈরি করুন। উদাহরণ টেস্ট "contacts"-এ পাঠানো সব Intent ইন্টারসেপ্ট করে এবং ফলাফল কোড
RESULT_OKব্যবহার করে সঠিকActivityResult-এর মাধ্যমে তাদের উত্তর স্টাব আউট করেKotlin
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);
Espresso-কে নির্দেশ দিন যাতে "contacts" ইনটেন্টের সব ইনভোকেশনের উত্তরে স্টাব ফলাফল অবজেক্ট প্রদান করে:
Kotlin
intending(toPackage("com.android.contacts")).respondWith(result)
জাভা
intending(toPackage("com.android.contacts")).respondWith(result);
অ্যাক্টিভিটি লঞ্চ করার জন্য ব্যবহৃত অ্যাকশনটি প্রত্যাশিত স্টাব ফলাফল তৈরি করে কিনা তা যাচাই করুন। এই ক্ষেত্রে, উদাহরণ টেস্ট চেক করে যে"পরিচিতি অ্যাক্টিভিটি" চালু করার সময় "১২৩-৩৪৫-৬৭৮৯" ফোন নম্বরটি রিটার্ন করা হয়েছে এবং দেখানো হয়েছে:
Kotlin
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() টেস্ট দেওয়া হল:
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))) }
জাভা
@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: ক্যামেরা ব্যবহার করে বিটম্যাপ ফেচ করা ব্যবহারকারীর অনুকরণ করে।