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

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

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

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