יש שלוש דרכים עיקריות לאינטראקציה עם רכיבי ממשק המשתמש:
- כלים לחיפוש מאפשרים לבחור רכיב אחד או יותר (או צומתים בעץ הסמנטיקה) כדי לבצע טענות נכוֹנוּת (assertions) או לבצע פעולות עליהם.
- הצהרות נכוֹנוּת משמשות לאימות שהרכיבים קיימים או שיש להם מאפיינים מסוימים.
- פעולות מחדירות אלמנטים של אירועי משתמשים מדומים, כמו קליקים או תנועות אחרות.
חלק מה-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
זמין בכל ה-finders. לדוגמה, כאן הוא משמש במאתר 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
.
אפשר לעיין ברשימה המלאה בחבילת הטיפים לבדיקת קובצי Compose.
יש גם פונקציות לבדיקת טענות נכוֹנוּת על אוסף של צמתים:
// 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.
פונקציות התאמה
יש מגוון של פונקציות התאמה (matchers) שזמינות לבדיקה של קוד 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: הספרייה מיועדת לממשקי משתמש מבוססי-תצוגה, אבל הידע ב-Espresso עדיין יכול לעזור בחלק מהיבטים של בדיקת Compose.