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

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

  • כלים לחיפוש מאפשרים לכם לבחור רכיב אחד או יותר (או צומתים בעץ הסמנטיקה) כדי לבצע טענות נכוֹנוּת (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"))

תוכלו לעיין ברשימה המלאה בתקציר לבדיקת הכתיבה.

מקורות מידע נוספים