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

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

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

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

الباحثون

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

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

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. يمكنك تصفُّح القائمة الكاملة في قائمة التحقّق من اختبار إنشاء المحتوى.

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

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

المطابقون الهرميّون

تتيح لك المطابقات التدرّجية الانتقال للأعلى أو للأسفل في شجرة الدلالات وتنفيذ عملية مطابقة.

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.
  • الاختبارات المحلية: يمكنك إجراء بعض الاختبارات محليًا على محطة العمل الخاصة بك.
  • الاختبارات الآلية: من المفيد أيضًا إجراء الاختبارات المعدّة للأجهزة. أي الاختبارات التي يتم إجراؤها مباشرةً على الجهاز.
  • التكامل المستمر: يتيح لك التكامل المستمر دمج اختباراتك في مسار إرسال المحتوى.
  • اختبار أحجام الشاشة المختلفة: مع توفّر العديد من الأجهزة للمستخدمين، يجب اختبار أحجام الشاشة المختلفة.
  • Espresso: على الرغم من أنّها مصمّمة لواجهات المستخدم القائمة على العرض، فإنّ الخبرة في استخدام Espresso يمكن أن تكون مفيدة لبعض جوانب اختبار Compose.