יש שלוש דרכים עיקריות לאינטראקציה עם רכיבי ממשק משתמש:
- כלי החיפוש מאפשרים לבחור רכיב אחד או יותר (או צמתים בעץ הסמנטי) כדי להצהיר עליהם או לבצע עליהם פעולות.
- טענות משמשות כדי לוודא שהרכיבים קיימים או שיש להם מאפיינים מסוימים.
- פעולות מחדירות אירועים מדומי משתמש ברכיבים, כמו קליקים או תנועות אחרות.
חלק מהממשקי ה-API האלה מקבלים SemanticsMatcher כדי להתייחס לאחד או יותר מהצמתים בעץ הסמנטיקה.
Finders
אפשר להשתמש ב-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()
מאפיינים לבחירת אלמנט
דרך נוספת ליצור בדיקות היא באמצעות selectors, שיכולים להפוך חלק מהבדיקות לקריאות יותר.
composeTestRule.onNode(hasTestTag("Players"))
.onChildren()
.filter(hasClickAction())
.assertCountEquals(4)
.onFirst()
.assert(hasText("John"))
אפשר לעיין ברשימה המלאה בדף התרמית לבדיקת כתיבה.
מקורות מידע נוספים
- בדיקת אפליקציות ב-Android: דף הנחיתה הראשי בנושא בדיקות ב-Android מספק סקירה רחבה יותר של עקרונות וטכניקות בדיקה.
- יסודות הבדיקה: מידע נוסף על המושגים הבסיסיים שמאחורי בדיקת אפליקציית Android.
- בדיקות מקומיות: אתם יכולים להריץ בדיקות מסוימות באופן מקומי, בתחנת העבודה שלכם.
- בדיקות עם מכשור: מומלץ להריץ גם בדיקות עם מכשור. כלומר, בדיקות שמופעלות ישירות במכשיר.
- אינטגרציה רציפה (CI): אינטגרציה רציפה מאפשרת לכם לשלב את הבדיקות בצינור הפריסה.
- בדיקה בגדלים שונים של מסכים: יש למשתמשים הרבה מכשירים שונים, ולכן כדאי לבדוק את האתר בגדלים שונים של מסכים.
- Espresso: למרות שהכלי מיועד לממשקי משתמש מבוססי-תצוגה, הידע ב-Espresso עדיין יכול לעזור בחלק מהבדיקות של Compose.