سه راه اصلی برای تعامل با عناصر UI وجود دارد:
- Finders به شما امکان می دهد یک یا چند عنصر (یا گره در درخت معناشناسی) را برای اظهار نظر یا انجام اقدامات روی آنها انتخاب کنید.
- اظهارات برای تأیید وجود یا داشتن ویژگی های خاص عناصر استفاده می شود.
- کنشها رویدادهای کاربر شبیهسازی شده را روی عناصر، مانند کلیکها یا سایر حرکات، تزریق میکنند.
برخی از این APIها SemanticsMatcher
برای ارجاع به یک یا چند گره در درخت semantics می پذیرند.
یابنده ها
میتوانید از 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"))
میتوانید فهرست کامل را در برگه تقلب «نوشتن تست» مرور کنید.
منابع اضافی
- آزمایش برنامه ها در اندروید : صفحه اصلی آزمایش اندروید نمای وسیع تری از اصول و تکنیک های آزمایش ارائه می دهد.
- اصول آزمایش : درباره مفاهیم اصلی آزمایش یک برنامه اندروید بیشتر بدانید.
- تست های محلی : می توانید برخی از آزمایش ها را به صورت محلی، در ایستگاه کاری خود اجرا کنید.
- تستهای ابزاری : اجرای تستهای ابزاری نیز تمرین خوبی است. یعنی تست هایی که مستقیماً روی دستگاه اجرا می شوند.
- ادغام مداوم : ادغام مداوم به شما امکان می دهد آزمایشات خود را در خط لوله استقرار خود ادغام کنید.
- اندازههای مختلف صفحه نمایش را آزمایش کنید : با دستگاههای زیادی که در دسترس کاربران است، باید اندازههای مختلف صفحه نمایش را آزمایش کنید.
- اسپرسو : در حالی که برای UI های مبتنی بر View در نظر گرفته شده است، دانش اسپرسو همچنان می تواند برای برخی از جنبه های تست Compose مفید باشد.