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

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

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

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

تتوفّر أيضًا دوال للتحقّق من صحة التأكيدات في مجموعة من العُقد:

// 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 Testing.

مراجع إضافية

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