اختبار واجهات برمجة التطبيقات

هناك ثلاث طرق رئيسية للتفاعل مع عناصر واجهة المستخدم:

  • تتيح لك الباحثون تحديد عنصر واحد أو عدة عناصر (أو عقد في شجرة الدلالات) لتأكيد تأكيدات أو تنفيذ إجراءات عليها.
  • تُستخدم التأكيدات للتحقق من توفّر العناصر أو من توفُّرها لسمات معينة.
  • تؤدي الإجراءات إلى إدخال أحداث المستخدمين التي تمت محاكاتها على العناصر، مثل النقرات أو الإيماءات الأخرى.

تقبل بعض واجهات برمجة التطبيقات هذه العلامة 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()

التأكيدات

يمكنك التحقق من التأكيدات من خلال استدعاء 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.

أدوات المطابقة

تتوفر مجموعة متنوعة من أدوات المطابقة لاختبار برمجة 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"))

يمكنك تصفح القائمة الكاملة في ورقة الملاحظات الموجزة لاختبار Compose.

مراجع إضافية

  • اختبار التطبيقات على Android: توفر الصفحة المقصودة لاختبار تطبيقات Android نظرة أوسع عن أساسيات الاختبار وتقنياته.
  • أساسيات الاختبار: تعرَّف على مزيد من المعلومات حول المفاهيم الأساسية لاختبار تطبيق Android.
  • الاختبارات المحلية: يمكنك إجراء بعض الاختبارات محليًا، في محطة عملك الخاصة.
  • الاختبارات الموجَّهة: من الممارسات الجيدة أيضًا إجراء الاختبارات الموجَّهة. أي، الاختبارات التي يتم إجرائها مباشرةً على الجهاز.
  • الدمج المستمر: يتيح لك الدمج المستمر دمج اختباراتك في مسار النشر.
  • اختبار أحجام الشاشات المختلفة: في ظل توفّر بعض الأجهزة للمستخدمين، عليك اختبار أحجام الشاشات المختلفة.
  • Espresso: على الرغم من أنّها مخصّصة لواجهات المستخدم المستندة إلى العرض، إلا أن الإلمام بقهوة Espresso يمكن أن يكون مفيدًا في بعض جوانب اختبار Compose.