UI এলিমেন্টের সাথে ইন্টার্যাক্ট করার তিনটি প্রধান উপায় আছে:
- ফাইন্ডার আপনাকে এক বা একাধিক এলিমেন্ট (বা সিম্যান্টিক্স ট্রিতে নোড) বেছে নিতে দেয় যাতে আপনি সেগুলির উপর অ্যাসার্শন করতে বা অ্যাকশন নিতে পারেন।
- এলিমেন্ট আছে কিনা বা নির্দিষ্ট অ্যাট্রিবিউট আছে কিনা তা যাচাই করতে অ্যাসার্শন ব্যবহার করা হয়।
- অ্যাকশন এলিমেন্টে সিমুলেটেড ব্যবহারকারী ইভেন্ট ইনজেক্ট করে, যেমন ক্লিক বা অন্যান্য জেসচার।
এইসব API-এর মধ্যে কিছু API, সিম্যান্টিক্স ট্রিতে এক বা একাধিক
নোড রেফার করার জন্য SemanticsMatcher গ্রহণ করে।
ফাইন্ডার
আপনি যথাক্রমে এক বা একাধিক নোড বেছে নিতে onNode এবং onAllNodes ব্যবহার করতে পারেন, তবে আপনি সবচেয়ে সাধারণ সার্চের জন্য কনভেনিয়েন্স ফাইন্ডারও ব্যবহার করতে পারেন, যেমন onNodeWithText এবং
onNodeWithContentDescription। আপনি
Compose Testing চিট শিট থেকে সম্পূর্ণ তালিকা ব্রাউজ করতে পারবেন।
একটি নোড বেছে নিন
composeTestRule.onNode(<<SemanticsMatcher>>, useUnmergedTree = false): SemanticsNodeInteraction
// Example
composeTestRule
.onNode(hasText("Button")) // Equivalent to onNodeWithText("Button")
একাধিক নোড বেছে নিন
composeTestRule
.onAllNodes(<<SemanticsMatcher>>): SemanticsNodeInteractionCollection
// Example
composeTestRule
.onAllNodes(hasText("Button")) // Equivalent to onAllNodesWithText("Button")
আনমার্জ করা ট্রি
কিছু Node তাদের চাইল্ডের সিম্যান্টিক তথ্য মার্জ করে। যেমন, দুটি টেক্সট এলিমেন্ট সহ একটি বোতাম টেক্সট এলিমেন্ট লেবেলগুলিকে মার্জ করে:
MyButton {
Text("Hello")
Text("World")
}
পরীক্ষা থেকে, সিম্যান্টিক্স ট্রি দেখাতে printToLog() ব্যবহার করুন:
composeTestRule.onRoot().printToLog("TAG")
এই কোডটি নিম্নলিখিত আউটপুট প্রিন্ট করে:
Node #1 at (...)px
|-Node #2 at (...)px
Role = 'Button'
Text = '[Hello, World]'
Actions = [OnClick, GetTextLayoutResult]
MergeDescendants = 'true'
আনমার্জ করা ট্রি-এর নোডের সাথে ম্যাচ করতে চাইলে, আপনি
useUnmergedTree-কে true হিসেবে সেট করতে পারবেন:
composeTestRule.onRoot(useUnmergedTree = true).printToLog("TAG")
এই কোডটি নিম্নলিখিত আউটপুট প্রিন্ট করে:
Node #1 at (...)px
|-Node #2 at (...)px
OnClick = '...'
MergeDescendants = 'true'
|-Node #3 at (...)px
| Text = '[Hello]'
|-Node #5 at (83.0, 86.0, 191.0, 135.0)px
Text = '[World]'
useUnmergedTree প্যারামিটার সব ফাইন্ডারে উপলভ্য। যেমন, এখানে
এটি onNodeWithText ফাইন্ডারে ব্যবহার করা হয়েছে।
composeTestRule
.onNodeWithText("World", useUnmergedTree = true).assertIsDisplayed()
দাবি
এক বা একাধিক ম্যাচারের সাথে ফাইন্ডারের মাধ্যমে রিটার্ন করা SemanticsNodeInteraction-এ assert() কল করে অ্যাসার্শন চেক করুন:
// Single matcher:
composeTestRule
.onNode(matcher)
.assert(hasText("Button")) // hasText is a SemanticsMatcher
// Multiple matchers can use and / or
composeTestRule
.onNode(matcher).assert(hasText("Button") or hasText("Button2"))
এছাড়াও, আপনি সবচেয়ে সাধারণ অ্যাসারশনের জন্য কনভেনিয়েন্স ফাংশন ব্যবহার করতে পারবেন, যেমন
assertExists, assertIsDisplayed এবং assertTextEquals।
আপনি Compose Testing চিট শিট থেকে সম্পূর্ণ তালিকা ব্রাউজ করতে পারবেন।
এছাড়াও, নোডের সংগ্রহে অ্যাসার্শন চেক করার জন্য ফাংশন আছে:
// Check number of matched nodes
composeTestRule
.onAllNodesWithContentDescription("Beatle").assertCountEquals(4)
// At least one matches
composeTestRule
.onAllNodesWithContentDescription("Beatle").assertAny(hasTestTag("Drummer"))
// All of them match
composeTestRule
.onAllNodesWithContentDescription("Beatle").assertAll(hasClickAction())
অ্যাকশন
কোনও নোডে অ্যাকশন ইনজেক্ট করতে, perform…() ফাংশন কল করুন:
composeTestRule.onNode(...).performClick()
এখানে কিছু অ্যাকশনের উদাহরণ দেওয়া হল:
performClick(),
performSemanticsAction(key),
performKeyPress(keyEvent),
performGesture { swipeLeft() }
আপনি Compose Testing চিট শিট থেকে সম্পূর্ণ তালিকা ব্রাউজ করতে পারবেন।
ম্যাচার
আপনার Compose কোড পরীক্ষা করার জন্য বিভিন্ন ধরনের ম্যাচিং টুল উপলভ্য আছে।
হায়ারার্কিক্যাল ম্যাচিং টুল
হায়ারার্কিক্যাল ম্যাচারের সাহায্যে আপনি সেম্যান্টিক্স ট্রির উপরে বা নিচে গিয়ে ম্যাচিং করতে পারবেন।
fun hasParent(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnySibling(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnyAncestor(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnyDescendant(matcher: SemanticsMatcher): SemanticsMatcher
এইসব ম্যাচিংয়ের কিছু উদাহরণ এখানে দেওয়া হল:
composeTestRule.onNode(hasParent(hasText("Button")))
.assertIsDisplayed()
বাছাইকারী
টেস্ট তৈরি করার বিকল্প উপায় হল নির্বাচক ব্যবহার করা যা কিছু টেস্টকে আরও সহজে পড়ার উপযোগী করে তুলতে পারে।
composeTestRule.onNode(hasTestTag("Players"))
.onChildren()
.filter(hasClickAction())
.assertCountEquals(4)
.onFirst()
.assert(hasText("John"))
আপনি Compose Testing চিট শিট থেকে সম্পূর্ণ তালিকা ব্রাউজ করতে পারবেন।
অতিরিক্ত রিসোর্স
- Android-এ অ্যাপ টেস্ট করা: Android-এ টেস্ট করার মূল ল্যান্ডিং পৃষ্ঠা থেকে টেস্টিংয়ের মূল বিষয় ও টেকনিক সম্পর্কে আরও বিস্তারিত তথ্য পাওয়া যায়।
- পরীক্ষা করার মূল বিষয়: Android অ্যাপ পরীক্ষা করার পিছনে থাকা মূল ধারণা সম্পর্কে আরও জানুন।
- লোকাল টেস্ট: আপনি নিজের ওয়ার্কস্টেশনে লোকালি কিছু টেস্ট চালাতে পারবেন।
- ইনস্ট্রুমেন্টেড টেস্ট: ইনস্ট্রুমেন্টেড টেস্ট রান করানোও একটি ভালো অভ্যাস। অর্থাৎ, সরাসরি ডিভাইসে রান করা টেস্ট।
- কন্টিনিউয়াস ইন্টিগ্রেশন: কন্টিনিউয়াস ইন্টিগ্রেশন আপনাকে ডিপ্লয়মেন্ট পাইপলাইনে টেস্ট ইন্টিগ্রেট করতে দেয়।
- বিভিন্ন স্ক্রিন সাইজ টেস্ট করুন: ব্যবহারকারীদের কাছে অনেক ডিভাইস উপলভ্য, তাই আপনাকে বিভিন্ন স্ক্রিন সাইজের জন্য টেস্ট করতে হবে।
- Espresso: View-ভিত্তিক UI-এর জন্য তৈরি করা হলেও, Espresso-এর জ্ঞান Compose টেস্টিংয়ের কিছু ক্ষেত্রে সহায়ক হতে পারে।