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

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

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

אפשר לעיין ברשימה המלאה בחבילת התכנים בנושא בדיקת קובצי קומפוזיציה.

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