יש שלוש דרכים עיקריות לאינטראקציה עם רכיבי ממשק משתמש:
- כלי החיפוש מאפשרים לבחור רכיב אחד או יותר (או צמתים בעץ הסמנטי) כדי להצהיר עליהם או לבצע עליהם פעולות.
- הצהרות משמשות כדי לוודא שהרכיבים קיימים או שיש להם מאפיינים מסוימים.
- פעולות מזריקות אירועים מדומי משתמש ברכיבים, כמו קליקים או מחוות אחרות.
חלק מהממשקי ה-API האלה מקבלים SemanticsMatcher כדי להתייחס לצמתים אחדים או יותר בעץ הסמנטיקה.
מאתרים
אפשר להשתמש ב-onNode וב-onAllNodes כדי לבחור צומת אחד או כמה צמתים בהתאמה, אבל אפשר גם להשתמש בכלי חיפוש נוחים לחיפושים הנפוצים ביותר, כמו onNodeWithText ו-onNodeWithContentDescription. אפשר לעיין ברשימה המלאה בדף התרמית לבדיקת כתיבה.
בחירת צומת יחיד
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")
עץ לא ממוזג
חלק מהצמתים ממזגים את המידע הסמנטי של צאצאיהם. לדוגמה, אם יש לחצן עם שני רכיבי טקסט, התוויות של רכיבי הטקסט ימוזגו:
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()
טענות נכוֹנוּת (assertions
כדי לבדוק טענות, קוראים ל-assert() ב-SemanticsNodeInteraction שמוחזר על ידי כלי חיפוש עם התאמה אחת או יותר:
// 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.
אפשר לעיין ברשימה המלאה בדף התרמית של בדיקות ההרכבה.
יש גם פונקציות לבדיקת טענות לגבי אוסף של צמתים:
// 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.
דפוסי התאמה היררכיים
התאמות היררכיות מאפשרות לכם לעלות או לרדת בעץ הסמנטיקה ולבצע התאמה.
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"))
אפשר לעיין ברשימה המלאה בדף התרמית של בדיקות ההרכבה.
מקורות מידע נוספים
- בדיקת אפליקציות ב-Android: דף הנחיתה הראשי בנושא בדיקות ב-Android מספק סקירה רחבה יותר של עקרונות וטכניקות בדיקה.
- היסודות של בדיקות: מידע נוסף על המושגים הבסיסיים שמאחורי בדיקת אפליקציית Android.
- בדיקות מקומיות: אתם יכולים להריץ כמה בדיקות באופן מקומי, בתחנת העבודה שלכם.
- בדיקות עם מכשור: מומלץ להריץ גם בדיקות עם מכשור. כלומר, בדיקות שמופעלות ישירות במכשיר.
- אינטגרציה רציפה (CI): אינטגרציה רציפה מאפשרת לכם לשלב את הבדיקות בצינור הפריסה.
- בדיקה של גדלי מסך שונים: יש למשתמשים הרבה מכשירים שונים, ולכן כדאי לבדוק גדלים שונים של מסכים.
- Espresso: למרות שהכלי מיועד לממשקי משתמש מבוססי-View, הידע ב-Espresso יכול להיות שימושי גם לבדיקה של חלק מההיבטים ב-Compose.