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

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

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

تقبل بعض واجهات برمجة التطبيقات هذه SemanticsMatcher للإشارة إلى عقدة واحدة أو أكثر في شجرة الدلالات.

أدوات البحث

يمكنك استخدام onNode وonAllNodes لاختيار عقدة واحدة أو عدة عُقد على التوالي، ولكن يمكنك أيضًا استخدام أدوات بحث سهلة الاستخدام لعمليات البحث الأكثر شيوعًا، مثل onNodeWithText و onNodeWithContentDescription. يمكنك تصفُّح القائمة الكاملة في الـ Compose Testing cheat sheet.

اختيار عقدة واحدة

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 Testing cheat sheet.

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

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