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

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

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

تقبل بعض واجهات برمجة التطبيقات هذه 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 مُصمَّمة لواجهات المستخدم المستندة إلى العرض، إلا أنّ معرفة أدوات Espresso يمكن أن تكون مفيدة في بعض جوانب اختبار Compose.