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