میاناهای برنامه‌سازی کاربردی آزمایشی

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

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

برخی‌از این میاناهای برنامه‌سازی کاربردی 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"))

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

منابع تکمیلی

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