আপনি সুপ্রতিষ্ঠিত পদ্ধতি ও প্যাটার্ন ব্যবহার করে আপনার কম্পোজ অ্যাপটি পরীক্ষা করতে পারেন।
বিচ্ছিন্নভাবে পরীক্ষা
ComposeTestRule আপনাকে যেকোনো কম্পোজেবল প্রদর্শন করে একটি অ্যাক্টিভিটি শুরু করার সুযোগ দেয়: আপনার সম্পূর্ণ অ্যাপ্লিকেশন, একটি একক স্ক্রিন, বা একটি ছোট এলিমেন্ট। আপনার কম্পোজেবলগুলো সঠিকভাবে এনক্যাপসুলেটেড আছে এবং সেগুলো স্বাধীনভাবে কাজ করছে কিনা, তা পরীক্ষা করাও একটি ভালো অভ্যাস, যা UI টেস্টিংকে আরও সহজ এবং সুনির্দিষ্ট করে তোলে।
এর মানে এই নয় যে আপনার শুধু ইউনিট UI টেস্ট তৈরি করা উচিত। আপনার UI-এর বৃহত্তর অংশ নিয়ে করা UI টেস্টগুলোও খুব গুরুত্বপূর্ণ।
আপনার নিজের বিষয়বস্তু সেট করার পরে কার্যকলাপ এবং সংস্থানগুলি অ্যাক্সেস করুন।
অনেক সময় composeTestRule.setContent ব্যবহার করে পরীক্ষাধীন কন্টেন্ট সেট করার প্রয়োজন হয় এবং অ্যাক্টিভিটির রিসোর্স অ্যাক্সেস করারও দরকার পড়ে, যেমন—প্রদর্শিত কোনো টেক্সট একটি স্ট্রিং রিসোর্সের সাথে মেলে কি না তা যাচাই করার জন্য। কিন্তু, createAndroidComposeRule() দিয়ে তৈরি করা কোনো রুলে আপনি setContent কল করতে পারবেন না, যদি অ্যাক্টিভিটিটি ইতিমধ্যেই তা কল করে থাকে।
এটি করার একটি প্রচলিত পদ্ধতি হলো ComponentActivity এর মতো একটি খালি অ্যাক্টিভিটি ব্যবহার করে একটি AndroidComposeTestRule তৈরি করা।
class MyComposeTest {
@get:Rule
val composeTestRule = createAndroidComposeRule<ComponentActivity>()
@Test
fun myTest() {
// Start the app
composeTestRule.setContent {
MyAppTheme {
MainScreen(uiState = exampleUiState, /*...*/)
}
}
val continueLabel = composeTestRule.activity.getString(R.string.next)
composeTestRule.onNodeWithText(continueLabel).performClick()
}
}
মনে রাখবেন, আপনার অ্যাপের AndroidManifest.xml ফাইলে ComponentActivity যোগ করতে হবে। আপনার মডিউলে এই ডিপেন্ডেন্সিটি যোগ করে এটি সক্রিয় করুন:
debugImplementation("androidx.compose.ui:ui-test-manifest:$compose_version")
কাস্টম শব্দার্থ বৈশিষ্ট্য
টেস্টের কাছে তথ্য প্রকাশ করার জন্য আপনি কাস্টম সিম্যান্টিকস প্রপার্টি তৈরি করতে পারেন। এটি করার জন্য, একটি নতুন SemanticsPropertyKey সংজ্ঞায়িত করুন এবং SemanticsPropertyReceiver ব্যবহার করে এটিকে উপলব্ধ করুন।
// Creates a semantics property of type Long.
val PickedDateKey = SemanticsPropertyKey<Long>("PickedDate")
var SemanticsPropertyReceiver.pickedDate by PickedDateKey
এখন semantics মডিফায়ারে সেই প্রপার্টিটি ব্যবহার করুন:
val datePickerValue by remember { mutableStateOf(0L) }
MyCustomDatePicker(
modifier = Modifier.semantics { pickedDate = datePickerValue }
)
টেস্ট থেকে, প্রপার্টির মান অ্যাসার্ট করতে SemanticsMatcher.expectValue ব্যবহার করুন:
composeTestRule
.onNode(SemanticsMatcher.expectValue(PickedDateKey, 1445378400)) // 2015-10-21
.assertExists()
অবস্থা পুনরুদ্ধার যাচাই করুন
অ্যাক্টিভিটি বা প্রসেসটি পুনরায় তৈরি করার সময় আপনার Compose এলিমেন্টগুলোর অবস্থা সঠিকভাবে পুনরুদ্ধার হচ্ছে কিনা তা যাচাই করুন। অ্যাক্টিভিটি পুনরায় তৈরির উপর নির্ভর না করে StateRestorationTester ক্লাস ব্যবহার করে এই ধরনের যাচাই সম্পাদন করুন।
এই ক্লাসটি আপনাকে একটি কম্পোজেবল-এর পুনঃসৃষ্টি অনুকরণ করতে দেয়। এটি বিশেষত rememberSaveable এর বাস্তবায়ন যাচাই করার জন্য উপযোগী।
class MyStateRestorationTests {
@get:Rule
val composeTestRule = createComposeRule()
@Test
fun onRecreation_stateIsRestored() {
val restorationTester = StateRestorationTester(composeTestRule)
restorationTester.setContent { MainScreen() }
// TODO: Run actions that modify the state
// Trigger a recreation
restorationTester.emulateSavedInstanceStateRestore()
// TODO: Verify that state has been correctly restored.
}
}
বিভিন্ন ডিভাইস কনফিগারেশন পরীক্ষা করুন
অ্যান্ড্রয়েড অ্যাপগুলোকে অনেক পরিবর্তনশীল পরিস্থিতির সাথে খাপ খাইয়ে নিতে হয়: যেমন উইন্ডোর আকার, লোকেল, ফন্টের আকার, ডার্ক ও লাইট থিম এবং আরও অনেক কিছু। এই পরিস্থিতিগুলোর বেশিরভাগই ডিভাইস-স্তরের মান থেকে উদ্ভূত হয়, যা ব্যবহারকারী দ্বারা নিয়ন্ত্রিত এবং বর্তমান Configuration ইনস্ট্যান্সের সাথে প্রকাশিত হয়। একটি টেস্টের মধ্যে সরাসরি বিভিন্ন কনফিগারেশন পরীক্ষা করা কঠিন, কারণ টেস্টটিকে অবশ্যই ডিভাইস-স্তরের বৈশিষ্ট্যগুলো কনফিগার করতে হয়।
DeviceConfigurationOverride হলো একটি শুধুমাত্র-পরীক্ষামূলক API যা আপনাকে পরীক্ষাধীন @Composable কন্টেন্টের জন্য বিভিন্ন ডিভাইস কনফিগারেশনকে স্থানীয় পদ্ধতিতে অনুকরণ করতে দেয়।
DeviceConfigurationOverride এর সহযোগী অবজেক্টটিতে নিম্নলিখিত এক্সটেনশন ফাংশনগুলো রয়েছে, যেগুলো ডিভাইস-স্তরের কনফিগারেশন প্রোপার্টিগুলোকে ওভাররাইড করে:
-
DeviceConfigurationOverride.DarkMode(): সিস্টেমকে ডার্ক থিম বা লাইট থিমে পরিবর্তন করে। -
DeviceConfigurationOverride.FontScale(): সিস্টেমের ফন্ট স্কেলকে পরিবর্তন করে। -
DeviceConfigurationOverride.FontWeightAdjustment(): সিস্টেমের ফন্ট ওয়েট অ্যাডজাস্টমেন্টকে ওভাররাইড করে। -
DeviceConfigurationOverride.ForcedSize(): ডিভাইসের আকার নির্বিশেষে একটি নির্দিষ্ট পরিমাণ স্থান বরাদ্দ করতে বাধ্য করে। -
DeviceConfigurationOverride.LayoutDirection(): লেআউটের দিক (বাম থেকে ডান অথবা ডান থেকে বাম) পরিবর্তন করে। -
DeviceConfigurationOverride.Locales(): লোকেলকে ওভাররাইড করে। -
DeviceConfigurationOverride.RoundScreen(): স্ক্রিন গোলাকার হলে এটি ওভাররাইড করে।
একটি নির্দিষ্ট ওভাররাইড প্রয়োগ করতে, পরীক্ষাধীন বিষয়বস্তুটিকে DeviceConfigurationOverride() শীর্ষ-স্তরের ফাংশনের একটি কলের মধ্যে রাখুন এবং প্রয়োগ করার জন্য ওভাররাইডটিকে একটি প্যারামিটার হিসাবে পাস করুন।
উদাহরণস্বরূপ, নিম্নলিখিত কোডটি DeviceConfigurationOverride.ForcedSize() ওভাররাইডটি প্রয়োগ করে স্থানীয়ভাবে ডেনসিটি পরিবর্তন করে, যার ফলে MyScreen কম্পোজেবলটি একটি বড় ল্যান্ডস্কেপ উইন্ডোতে রেন্ডার হতে বাধ্য হয়, এমনকি যদি পরীক্ষাটি যে ডিভাইসে চলছে সেটি সরাসরি সেই উইন্ডো সাইজটি সমর্থন না-ও করে:
composeTestRule.setContent { DeviceConfigurationOverride( DeviceConfigurationOverride.ForcedSize(DpSize(1280.dp, 800.dp)) ) { MyScreen() // Will be rendered in the space for 1280dp by 800dp without clipping. } }
একাধিক ওভাররাইড একসাথে প্রয়োগ করতে, DeviceConfigurationOverride.then() ব্যবহার করুন:
composeTestRule.setContent { DeviceConfigurationOverride( DeviceConfigurationOverride.FontScale(1.5f) then DeviceConfigurationOverride.FontWeightAdjustment(200) ) { Text(text = "text with increased scale and weight") } }
অতিরিক্ত সম্পদ
- অ্যান্ড্রয়েডে অ্যাপ পরীক্ষা করুন : অ্যান্ড্রয়েড টেস্টিং-এর প্রধান ল্যান্ডিং পেজটি টেস্টিং-এর মৌলিক বিষয় এবং কৌশল সম্পর্কে একটি বিস্তৃত ধারণা প্রদান করে।
- টেস্টিংয়ের মূল বিষয়সমূহ : একটি অ্যান্ড্রয়েড অ্যাপ টেস্টিং করার পেছনের মূল ধারণাগুলো সম্পর্কে আরও জানুন।
- স্থানীয় পরীক্ষা : আপনি কিছু পরীক্ষা স্থানীয়ভাবে, আপনার নিজের ওয়ার্কস্টেশনে চালাতে পারেন।
- ইনস্ট্রুমেন্টেড টেস্ট : ইনস্ট্রুমেন্টেড টেস্ট চালানোও একটি ভালো অভ্যাস। অর্থাৎ, যে টেস্টগুলো সরাসরি ডিভাইসে চলে।
- কন্টিনিউয়াস ইন্টিগ্রেশন : কন্টিনিউয়াস ইন্টিগ্রেশন আপনাকে আপনার টেস্টগুলোকে ডেপ্লয়মেন্ট পাইপলাইনে একীভূত করতে দেয়।
- বিভিন্ন স্ক্রিন সাইজ পরীক্ষা করুন : ব্যবহারকারীদের জন্য যেহেতু অনেক ডিভাইস উপলব্ধ আছে, তাই আপনার বিভিন্ন স্ক্রিন সাইজ পরীক্ষা করে দেখা উচিত।
- এসপ্রেসো : যদিও এটি ভিউ-ভিত্তিক UI-এর জন্য তৈরি, কম্পোজ টেস্টিং-এর কিছু ক্ষেত্রে এসপ্রেসো সম্পর্কিত জ্ঞান সহায়ক হতে পারে।