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