ממשקי API לבדיקה

יש שלוש דרכים עיקריות לאינטראקציה עם רכיבי ממשק משתמש:

  • כלי החיפוש מאפשרים לבחור רכיב אחד או יותר (או צמתים בעץ הסמנטי) כדי ליצור טענות או לבצע פעולות לגביהם.
  • משתמשים בטענות כדי לוודא שהרכיבים קיימים או שיש להם מאפיינים מסוימים.
  • פעולות מזריקות אירועים מדומי משתמש ברכיבים, כמו קליקים או מחוות אחרות.

חלק מהממשקי ה-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: למרות שהכלי מיועד לממשקי משתמש מבוססי-תצוגה, הידע ב-Espresso יכול לעזור בהיבטים מסוימים של בדיקות ב-Compose.