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

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

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

חלק מממשקי ה-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 זמין לכל מי שמחפש. לדוגמה, כאן הוא משמש במאתר 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.

יש גם פונקציות לבדיקת טענות נכונות (assertions) באוסף של צמתים:

// 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() }

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

פונקציות התאמה

אפשר להשתמש במגוון התאמות כדי לבדוק את הכתיבה

התנאים ההיררכיים

באמצעות תואמים היררכיים אפשר לנוע למעלה או למטה בעץ הסמנטיקה ולבצע התאמה.

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