বেশিরভাগ অ্যান্ড্রয়েড UI টেস্টের মতো নয়, ম্যাক্রোবেঞ্চমার্ক টেস্টগুলো অ্যাপটি থেকে আলাদা একটি প্রসেসে চলে। অ্যাপ প্রসেস বন্ধ করা এবং DEX বাইটকোড থেকে মেশিন কোডে কম্পাইল করার মতো বিষয়গুলো সক্ষম করার জন্য এটি প্রয়োজনীয়।
আপনি UIAutomator লাইব্রেরি অথবা এমন অন্যান্য পদ্ধতির মাধ্যমে আপনার অ্যাপের স্টেট নিয়ন্ত্রণ করতে পারেন, যা টেস্ট প্রসেস থেকেই টার্গেট অ্যাপটিকে নিয়ন্ত্রণ করতে পারে। UI Automator-এ Compose এলিমেন্টগুলো প্রকাশ করতে Modifier.testTag ব্যবহার করুন।
নিম্নলিখিত উদাহরণটিতে testTag সহ একটি LazyColumn ব্যবহার করা হয়েছে:
@Composable
fun ProductListScreen() {
LazyColumn(
modifier = Modifier
.fillMaxSize()
.testTag("my_lazy_column") ) {
items(100) { index ->
ProductItem(index)
}
}
}
টেস্টটি LazyColumn খুঁজে বের করতে এবং সেটিকে ফ্লিং করতে testTag ব্যবহার করে:
@Test
fun scrollList() {
benchmarkRule.measureRepeated(
packageName = "com.example.myapp",
metrics = listOf(FrameTimingMetric()),
iterations = 5,
setupBlock = {
uiAutomator {
pressHome()
startApp("com.example.myapp")
}
}
) {
uiAutomator {
// Find the Composable using its testTag mapped as a viewIdResourceName
val lazyColumn = onElement { viewIdResourceName == "my_lazy_column" }
// Fling the Compose list down
repeat(3) {
lazyColumn.fling(Direction.DOWN)
}
}
}
}
আপনার বেঞ্চমার্কের জন্য UI স্ক্রল করার প্রয়োজন নেই। এর পরিবর্তে, এটি একটি অ্যানিমেশন চালাতে পারে। এর জন্য বিশেষভাবে UI Automator ব্যবহার করারও প্রয়োজন নেই। যতক্ষণ ফ্রেম তৈরি হতে থাকে, ততক্ষণ এটি পারফরম্যান্স মেট্রিক সংগ্রহ করে।
গভীর রচনাযোগ্য গন্তব্যগুলিতে নেভিগেট করুন
কখনও কখনও আপনি এমন একটি নির্দিষ্ট স্ক্রিনের কার্যকারিতা যাচাই করতে চাইতে পারেন যা অ্যাপটি চালু হওয়ার সাথে সাথে দেখা যায় না, যেমন আপনার জেটপ্যাক নেভিগেশন গ্রাফের গভীরে থাকা কোনো ডিটেইলস স্ক্রিন বা চেকআউট পেজ।
যেহেতু ম্যাক্রোবেঞ্চমার্ক আউট-অফ-প্রসেস চলে, তাই স্ক্রিন বদলানোর জন্য আপনি সরাসরি আপনার NavController সাথে ইন্টারঅ্যাক্ট করতে পারবেন না। এর পরিবর্তে, আপনার বেঞ্চমার্কে এমন একটি পরিস্থিতি অনুকরণ করতে হবে যেখানে একজন ব্যবহারকারী অ্যাপের সেই নির্দিষ্ট অংশে নেভিগেট করছেন।
প্রস্তুতিমূলক ধাপগুলো, যেমন অনবোর্ডিং ফ্লো বা মেনু বাটনে ক্লিক করার মতো কাজগুলো সামলাতে setupBlock ব্যবহার করুন। এর ফলে, আপনার measureBlock শুধুমাত্র নির্দিষ্ট স্ক্রিনের পারফরম্যান্স মেট্রিকগুলো সংগ্রহ করবে।
@Test
fun deepScreenScrollList() {
benchmarkRule.measureRepeated(
packageName = "com.example.myapp",
metrics = listOf(FrameTimingMetric()),
iterations = 5,
setupBlock = {
uiAutomator {
// 1. Start the app on the home screen
startApp("com.example.myapp")
// 2. Navigate to the internal screen by clicking a Compose component
// (e.g., a card that opens the target list view)
val settingsButton = onElement { viewIdResourceName == "go_to_list_button" }
settingsButton.click()
// 3. Wait until the target screen settles and is fully rendered
waitForStableInActiveWindow()
}
}
) {
uiAutomator {
// The actual benchmark measurement starts here on the target screen
val lazyColumn = onElement { viewIdResourceName == "my_lazy_column" }
lazyColumn.fling(Direction.DOWN)
}
}
}
অতিরিক্ত সম্পদ
পরীক্ষা সম্পর্কে আরও তথ্যের জন্য, নিম্নলিখিত উৎসগুলো দেখুন।
ডকুমেন্টেশন
বিষয়বস্তু দেখুন
{% হুবহু %}আপনার জন্য প্রস্তাবিত
- দ্রষ্টব্য: জাভাস্ক্রিপ্ট বন্ধ থাকলেও লিঙ্কের লেখা প্রদর্শিত হয়।
- একটি ম্যাক্রোবেঞ্চমার্ক লেখা
- ম্যাক্রোবেঞ্চমার্ক মেট্রিক্স ক্যাপচার করুন
- মাইক্রোবেঞ্চমার্ক