এই বিষয়ে বর্ণনা করা হয়েছে যে কীভাবে টেস্টে ফ্রেমওয়ার্ক-প্রদত্ত API অন্তর্ভুক্ত করতে হয় যা প্রতিটি ফ্র্যাগমেন্টের আচরণ মূল্যায়ন করে।
ফ্র্যাগমেন্ট আপনার অ্যাপের মধ্যে আবার ব্যবহার করা যায় এমন কন্টেনার হিসেবে কাজ করে, যা আপনাকে বিভিন্ন অ্যাক্টিভিটি ও লেআউট কনফিগারেশনে একই ইউজার ইন্টারফেস লেআউট উপস্থাপন করার অনুমতি দেয়। ফ্র্যাগমেন্টের বহুমুখী ব্যবহারের কথা মাথায় রেখে, এটি যাচাই করা গুরুত্বপূর্ণ যে সেগুলি যেন ধারাবাহিক এবং রিসোর্স-দক্ষ অভিজ্ঞতা প্রদান করে। এগুলি মনে রাখবেন:
- আপনার ফ্র্যাগমেন্ট কোনও নির্দিষ্ট পেরেন্ট অ্যাক্টিভিটি বা ফ্র্যাগমেন্টের উপর নির্ভর করা উচিত নয়।
- ফ্র্যাগমেন্ট ব্যবহারকারীকে দৃশ্যমান না হলে আপনার ফ্র্যাগমেন্টের ভিউ হায়ারার্কি তৈরি করা উচিত নয়।
এইসব টেস্ট করার জন্য শর্ত সেট-আপ করতে সাহায্য করার জন্য, AndroidX
fragment-testing লাইব্রেরি
FragmentScenario
ক্লাস প্রদান করে যাতে ফ্র্যাগমেন্ট তৈরি করা যায় এবং তাদের
Lifecycle.State পরিবর্তন করা যায়।
ডিপেন্ডেন্সি ঘোষণা করা
FragmentScenario ব্যবহার করতে, debugImplementation ব্যবহার করে আপনার অ্যাপের build.gradle ফাইলে fragment-testing-manifest আর্টিফ্যাক্ট এবং androidTestImplementation ব্যবহার করে fragment-testing আর্টিফ্যাক্ট ডিফাইন করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
গ্রোভি
dependencies { def fragment_version = "1.9.1" debugImplementation "androidx.fragment:fragment-testing-manifest:$fragment_version" androidTestImplementation "androidx.fragment:fragment-testing:$fragment_version" }
কোটলিন
dependencies { val fragment_version = "1.9.1" debugImplementation("androidx.fragment:fragment-testing-manifest:$fragment_version") androidTestImplementation("androidx.fragment:fragment-testing:$fragment_version") }
এই পৃষ্ঠায় টেস্টিংয়ের উদাহরণ Espresso এবং Truth লাইব্রেরি থেকে অ্যাসারশন ব্যবহার করে। অন্যান্য উপলভ্য টেস্টিং ও অ্যাসার্শন লাইব্রেরি সম্পর্কে তথ্যের জন্য, AndroidX টেস্টের জন্য প্রোজেক্ট সেট-আপ করুন দেখুন।
ফ্র্যাগমেন্ট তৈরি করুন
FragmentScenario-এ টেস্টে ফ্র্যাগমেন্ট লঞ্চ করার জন্য নিম্নলিখিত পদ্ধতিগুলি
অন্তর্ভুক্ত রয়েছে:
launchInContainer(), ফ্র্যাগমেন্টের ইউজার ইন্টারফেস পরীক্ষা করার জন্য।FragmentScenarioফ্র্যাগমেন্টকে অ্যাক্টিভিটির রুট ভিউ কন্ট্রোলারের সাথে অ্যাটাচ করে। এই অ্যাক্টিভিটি অন্যথায় খালি।launch(), ফ্র্যাগমেন্টের ইউজার ইন্টারফেস ছাড়াই পরীক্ষা করার জন্য।FragmentScenarioএই ধরনের ফ্র্যাগমেন্টকে খালি অ্যাক্টিভিটির সাথে অ্যাটাচ করে, যার কোনও রুট ভিউ নেই।
এইসব ফ্র্যাগমেন্টের ধরনগুলির মধ্যে একটি লঞ্চ করার পরে, FragmentScenario
পরীক্ষা করা ফ্র্যাগমেন্টকে একটি নির্দিষ্ট স্টেটে নিয়ে যায়। ডিফল্ট হিসেবে এই স্টেট হল RESUMED,
তবে আপনি initialState আর্গুমেন্ট ব্যবহার করে এটি ওভাররাইড করতে পারবেন। RESUMED স্টেট
থেকে বোঝা যায় যে ফ্র্যাগমেন্ট চলছে এবং ব্যবহারকারী তা দেখতে পাচ্ছেন। আপনি Espresso UI
টেস্ট ব্যবহার করে এর UI এলিমেন্ট সম্পর্কে তথ্য মূল্যায়ন করতে পারেন।
প্রতিটি পদ্ধতি ব্যবহার করে কীভাবে আপনার ফ্র্যাগমেন্ট লঞ্চ করবেন তা নিম্নলিখিত কোডের উদাহরণ থেকে জানতে পারবেন:
launchInContainer() উদাহরণ
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEventFragment() {
// The "fragmentArgs" argument is optional.
val fragmentArgs = bundleOf(“selectedListItem” to 0)
val scenario = launchFragmentInContainer<EventFragment>(fragmentArgs)
...
}
}
launch() উদাহরণ
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEventFragment() {
// The "fragmentArgs" arguments are optional.
val fragmentArgs = bundleOf("numElements" to 0)
val scenario = launchFragment<EventFragment>(fragmentArgs)
...
}
}
ডিপেন্ডেন্সি প্রদান করুন
আপনার ফ্র্যাগমেন্টের ডিপেন্ডেন্সি থাকলে, আপনি launchInContainer() বা launch() পদ্ধতিতে কাস্টম FragmentFactory প্রদান করে
এইসব ডিপেন্ডেন্সির টেস্ট ভার্সন প্রদান করতে পারবেন।
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEventFragment() {
val someDependency = TestDependency()
launchFragmentInContainer {
EventFragment(someDependency)
}
...
}
}
ফ্র্যাগমেন্টে ডিপেন্ডেন্সি প্রদান করার জন্য FragmentFactory ব্যবহার করা সম্পর্কে আরও তথ্য পেতে, ফ্র্যাগমেন্ট ম্যানেজার দেখুন।
ফ্র্যাগমেন্টকে নতুন অবস্থায় নিয়ে যান
আপনার অ্যাপের UI টেস্টে, সাধারণত টেস্টের অধীনে ফ্র্যাগমেন্ট লঞ্চ করা এবং RESUMED স্টেট থেকে এটি টেস্ট করা শুরু করাই যথেষ্ট। তবে, আরও সূক্ষ্ম-গ্রেনড
ইউনিট টেস্টে, আপনি ফ্র্যাগমেন্টের আচরণও মূল্যায়ন করতে পারেন
কারণ এটি একটি লাইফসাইকেল স্টেট থেকে অন্য স্টেটে ট্রানজিশন করে। আপনি যেকোনও launchFragment*() ফাংশনে initialState আর্গুমেন্ট পাস করে
প্রাথমিক অবস্থা নির্দিষ্ট করতে পারেন।
ফ্র্যাগমেন্টকে অন্য লাইফসাইকেল স্টেটে নিয়ে যেতে, moveToState() কল করুন।
এই পদ্ধতিতে আর্গুমেন্ট হিসেবে নিম্নলিখিত স্টেটগুলি কাজ করে: CREATED,
STARTED, RESUMED এবং DESTROYED। এই পদ্ধতিটি এমন একটি পরিস্থিতিকে সিমুলেট করে
যেখানে আপনার ফ্র্যাগমেন্ট ধারণকারী ফ্র্যাগমেন্ট বা অ্যাক্টিভিটি যেকোনও কারণে
তার অবস্থা পরিবর্তন করে।
নিম্নলিখিত উদাহরণে INITIALIZED অবস্থায় একটি টেস্ট ফ্র্যাগমেন্ট লঞ্চ করা হয় এবং
তারপর সেটিকে RESUMED অবস্থায় নিয়ে যাওয়া হয়:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEventFragment() {
val scenario = launchFragmentInContainer<EventFragment>(
initialState = Lifecycle.State.INITIALIZED
)
// EventFragment has gone through onAttach(), but not onCreate().
// Verify the initial state.
scenario.moveToState(Lifecycle.State.RESUMED)
// EventFragment moves to CREATED -> STARTED -> RESUMED.
...
}
}
ফ্র্যাগমেন্ট আবার তৈরি করুন
আপনার অ্যাপ যদি এমন কোনও ডিভাইসে চলে যেখানে রিসোর্স কম, তাহলে সিস্টেম
আপনার ফ্র্যাগমেন্ট সহ অ্যাক্টিভিটি নষ্ট করে দিতে পারে। এই পরিস্থিতিতে
ব্যবহারকারী ফিরে এলে আপনার অ্যাপকে ফ্র্যাগমেন্ট আবার তৈরি করতে হবে।
এই পরিস্থিতি সিমুলেট করতে, recreate() কল করুন:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEventFragment() {
val scenario = launchFragmentInContainer<EventFragment>()
scenario.recreate()
...
}
}
FragmentScenario.recreate()
ফ্র্যাগমেন্ট এবং তার হোস্ট মুছে দেয় এবং তারপর সেগুলি আবার তৈরি করে। FragmentScenario ক্লাস
পরীক্ষা করা ফ্র্যাগমেন্টটি আবার তৈরি করলে, ফ্র্যাগমেন্টটি
নষ্ট হওয়ার আগে যে লাইফসাইকেল স্টেটে ছিল, সেখানে ফিরে যায়।
UI ফ্র্যাগমেন্টের সাথে ইন্টার্যাক্ট করা
পরীক্ষা করা হচ্ছে এমন ফ্র্যাগমেন্টে UI অ্যাকশন ট্রিগার করতে, আপনার ভিউতে এলিমেন্টের সাথে ইন্টার্যাক্ট করতে Espresso ভিউ ম্যাচিং ব্যবহার করুন:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEventFragment() {
val scenario = launchFragmentInContainer<EventFragment>()
onView(withId(R.id.refresh)).perform(click())
// Assert some expected behavior
...
}
}
ফ্র্যাগমেন্টেই কোনও মেথড কল করতে হলে, যেমন বিকল্পের মেনুতে কোনও বাছাইয়ের
উত্তর দিতে, আপনি
FragmentScenario.onFragment()
ব্যবহার করে ফ্র্যাগমেন্টের রেফারেন্স পেয়ে এবং
FragmentAction-এ পাস করে নিরাপদে তা করতে পারবেন:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEventFragment() {
val scenario = launchFragmentInContainer<EventFragment>()
scenario.onFragment { fragment ->
fragment.myInstanceMethod()
}
}
}
ডায়ালগ অ্যাকশন পরীক্ষা করুন
FragmentScenario-এ
ডায়ালগ ফ্র্যাগমেন্ট টেস্ট করার সুবিধাও আছে। ডায়ালগ ফ্র্যাগমেন্টে
UI এলিমেন্ট থাকলেও, অ্যাক্টিভিটির পরিবর্তে
আলাদা উইন্ডোতে এর লেআউট দেখানো হয়। এই কারণে, ডায়ালগ ফ্র্যাগমেন্ট টেস্ট করতে
FragmentScenario.launch() ব্যবহার করুন।
নিম্নলিখিত উদাহরণটি ডায়ালগ বাতিল করার প্রসেস টেস্ট করে:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testDismissDialogFragment() {
// Assumes that "MyDialogFragment" extends the DialogFragment class.
with(launchFragment<MyDialogFragment>()) {
onFragment { fragment ->
assertThat(fragment.dialog).isNotNull()
assertThat(fragment.requireDialog().isShowing).isTrue()
fragment.dismiss()
fragment.parentFragmentManager.executePendingTransactions()
assertThat(fragment.dialog).isNull()
}
}
// Assumes that the dialog had a button
// containing the text "Cancel".
onView(withText("Cancel")).check(doesNotExist())
}
}