تست های خود را همگام کنید

تست های نوشتن به طور پیش فرض با رابط کاربری شما همگام می شوند. هنگامی که یک ادعا یا یک عملکرد را با ComposeTestRule فرا می‌خوانید، آزمایش از قبل همگام‌سازی می‌شود و منتظر می‌ماند تا درخت UI بیکار شود.

به طور معمول، شما نیازی به انجام هیچ اقدامی ندارید. با این حال، برخی از موارد لبه وجود دارد که باید در مورد آنها بدانید.

وقتی آزمایشی همگام‌سازی می‌شود، برنامه Compose شما با استفاده از یک ساعت مجازی به موقع پیشرفت می‌کند. این بدان معناست که تست‌های Compose در زمان واقعی اجرا نمی‌شوند، بنابراین می‌توانند با بیشترین سرعت ممکن انجام شوند.

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

@Test
fun counterTest() {
    val myCounter = mutableStateOf(0) // State that can cause recompositions.
    var lastSeenValue = 0 // Used to track recompositions.
    composeTestRule.setContent {
        Text(myCounter.value.toString())
        lastSeenValue = myCounter.value
    }
    myCounter.value = 1 // The state changes, but there is no recomposition.

    // Fails because nothing triggered a recomposition.
    assertTrue(lastSeenValue == 1)

    // Passes because the assertion triggers recomposition.
    composeTestRule.onNodeWithText("1").assertExists()
}

توجه داشته باشید که این الزام فقط برای سلسله مراتب های Compose اعمال می شود و برای بقیه برنامه ها اعمال نمی شود.

همگام سازی خودکار را غیرفعال کنید

وقتی از طریق ComposeTestRule مانند assertExists() یک ادعا یا اقدام را فراخوانی می کنید، آزمون شما با Compose UI همگام می شود. در برخی موارد ممکن است بخواهید این همگام سازی را متوقف کنید و خودتان ساعت را کنترل کنید. برای مثال، می‌توانید زمان را برای گرفتن اسکرین‌شات‌های دقیق از یک انیمیشن در نقطه‌ای که رابط کاربری همچنان مشغول است، کنترل کنید. برای غیرفعال کردن همگام سازی خودکار، ویژگی autoAdvance را در mainClock روی false قرار دهید:

composeTestRule.mainClock.autoAdvance = false

معمولاً پس از آن زمان را خودتان پیش خواهید برد. می‌توانید دقیقاً یک فریم با advanceTimeByFrame() یا با مدت زمان مشخص با advanceTimeBy() جلو ببرید:

composeTestRule.mainClock.advanceTimeByFrame()
composeTestRule.mainClock.advanceTimeBy(milliseconds)

منابع بیکار

Compose می‌تواند تست‌ها و UI را همگام‌سازی کند تا هر اقدام و ادعا در حالت بی‌کار انجام شود، در انتظار یا پیشبرد ساعت در صورت نیاز. با این حال، برخی از عملیات ناهمزمان که نتایج آنها بر وضعیت رابط کاربری تأثیر می‌گذارد، می‌توانند در پس‌زمینه اجرا شوند در حالی که آزمایش از آنها بی‌اطلاع است.

این منابع غیرفعال را در آزمون خود ایجاد و ثبت کنید تا هنگام تصمیم گیری در مورد شلوغ یا غیرفعال بودن برنامه مورد آزمایش در نظر گرفته شوند. لازم نیست اقدامی انجام دهید، مگر اینکه نیاز به ثبت منابع غیرفعال اضافی داشته باشید، برای مثال، اگر یک کار پس‌زمینه اجرا می‌کنید که با اسپرسو یا نوشتن هماهنگ نیست.

این API بسیار شبیه به منابع Idling Espresso است تا نشان دهد که آیا موضوع مورد آزمایش بیکار است یا مشغول است. از قانون آزمون Compose برای ثبت اجرای IdlingResource استفاده کنید.

composeTestRule.registerIdlingResource(idlingResource)
composeTestRule.unregisterIdlingResource(idlingResource)

همگام سازی دستی

در موارد خاص، باید رابط کاربری Compose را با بخش‌های دیگر آزمون یا برنامه‌ای که در حال آزمایش هستید، همگام کنید.

تابع waitForIdle() منتظر می ماند تا Compose بیکار باشد، اما تابع به ویژگی autoAdvance بستگی دارد:

composeTestRule.mainClock.autoAdvance = true // Default
composeTestRule.waitForIdle() // Advances the clock until Compose is idle.

composeTestRule.mainClock.autoAdvance = false
composeTestRule.waitForIdle() // Only waits for idling resources to become idle.

توجه داشته باشید که در هر دو مورد، waitForIdle() همچنین منتظر پاس های در حال انتظار کشیدن و طرح بندی می ماند .

همچنین، می‌توانید ساعت را تا زمانی که یک شرط خاص با advanceTimeUntil() برآورده شود، پیش ببرید.

composeTestRule.mainClock.advanceTimeUntil(timeoutMs) { condition }

توجه داشته باشید که شرط داده شده باید وضعیتی را بررسی کند که می تواند تحت تأثیر این ساعت قرار گیرد (این ساعت فقط با حالت Compose کار می کند).

منتظر شرایط باشید

هر شرطی که به کار خارجی بستگی دارد، مانند بارگذاری داده یا اندازه گیری یا ترسیم اندروید (یعنی اندازه گیری یا ترسیم خارجی برای Compose)، باید از مفهوم کلی تری مانند waitUntil() استفاده کند:

composeTestRule.waitUntil(timeoutMs) { condition }

همچنین می‌توانید از هرکدام از راهنماهای waitUntil استفاده کنید:

composeTestRule.waitUntilAtLeastOneExists(matcher, timeoutMs)

composeTestRule.waitUntilDoesNotExist(matcher, timeoutMs)

composeTestRule.waitUntilExactlyOneExists(matcher, timeoutMs)

composeTestRule.waitUntilNodeCount(matcher, count, timeoutMs)

منابع اضافی

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