تست API ها

سه روش اصلی برای تعامل با عناصر رابط کاربری وجود دارد:

  • یابنده‌ها به شما امکان می‌دهند یک یا چند عنصر (یا گره در درخت معنایی) را برای ایجاد ادعا یا انجام اقدامات روی آنها انتخاب کنید.
  • از ادعاها برای تأیید وجود عناصر یا داشتن ویژگی‌های خاص استفاده می‌شود.
  • اکشن‌ها رویدادهای شبیه‌سازی‌شده‌ی کاربر، مانند کلیک‌ها یا سایر حرکات را روی عناصر تزریق می‌کنند.

برخی از این APIها یک SemanticsMatcher را برای ارجاع به یک یا چند گره در درخت معنایی می‌پذیرند.

یابنده‌ها

می‌توانید از onNode و onAllNodes برای انتخاب یک یا چند گره به ترتیب استفاده کنید، اما می‌توانید از جستجوگرهای راحت‌تر برای رایج‌ترین جستجوها، مانند onNodeWithText و onNodeWithContentDescription ، نیز استفاده کنید. می‌توانید لیست کامل را در برگه تقلب Compose Testing مرور کنید.

یک گره واحد را انتخاب کنید

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"))

همچنین می‌توانید از توابع کمکی برای رایج‌ترین assertionها، مانند 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 Testing مرور کنید.

تطبیق‌دهنده‌ها

انواع مختلفی از تطبیق‌دهنده‌ها برای آزمایش کد 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 مرور کنید.

منابع اضافی

  • تست برنامه‌ها در اندروید : صفحه اصلی تست اندروید، نمای وسیع‌تری از اصول و تکنیک‌های تست ارائه می‌دهد.
  • اصول اولیه تست : درباره مفاهیم اصلی پشت تست یک برنامه اندروید بیشتر بدانید.
  • تست‌های محلی : شما می‌توانید برخی از تست‌ها را به صورت محلی، روی ایستگاه کاری خودتان اجرا کنید.
  • تست‌های ابزاری : اجرای تست‌های ابزاری نیز روش خوبی است. یعنی تست‌هایی که مستقیماً روی دستگاه اجرا می‌شوند.
  • ادغام مداوم : ادغام مداوم به شما امکان می‌دهد تست‌های خود را در خط تولید خود ادغام کنید.
  • آزمایش اندازه‌های مختلف صفحه نمایش : با توجه به اینکه دستگاه‌های زیادی در دسترس کاربران است، باید اندازه‌های مختلف صفحه نمایش را آزمایش کنید.
  • Espresso : اگرچه برای رابط‌های کاربری مبتنی بر View در نظر گرفته شده است، اما دانش Espresso همچنان می‌تواند برای برخی از جنبه‌های تست Compose مفید باشد.