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