از Espresso Device API برای آزمایش برنامه خود هنگام تغییرات پیکربندی رایج دستگاه، مانند چرخش و باز شدن صفحه، استفاده کنید. Espresso Device API ابزار پیشنهادی برای انجام اقدامات سطح دستگاه در کنار قوانین تست Jetpack Compose شماست. اگر در نوشتن تستهای رابط کاربری برای Jetpack Compose تازهکار هستید، به بخش «تست طرحبندی Compose» مراجعه کنید.
رابط برنامهنویسی کاربردی دستگاه Espresso به شما امکان میدهد تغییرات پیکربندی را روی یک دستگاه مجازی اعمال کنید و تستهای خود را به صورت همزمان اجرا کنید، بنابراین فقط یک اقدام یا ادعای رابط کاربری در یک زمان اتفاق میافتد و نتایج تست شما قابل اعتمادتر است. اگر در نوشتن تستهای رابط کاربری با Espresso تازهکار هستید، به مستندات آن مراجعه کنید.
برای استفاده از رابط برنامهنویسی کاربردی (API) دستگاه اسپرسو، به موارد زیر نیاز دارید:
- اندروید استودیو ایگوانا یا بالاتر
- افزونه اندروید Gradle نسخه ۸.۳ یا بالاتر
- شبیهساز اندروید ۳۳.۱.۱۰ یا بالاتر
- دستگاه مجازی اندروید که API سطح ۲۴ یا بالاتر را اجرا میکند
پروژه خود را برای رابط برنامهنویسی کاربردی (API) دستگاه اسپرسو تنظیم کنید
برای تنظیم پروژه خود به گونهای که از Espresso Device API پشتیبانی کند، موارد زیر را انجام دهید:
برای اینکه تست، دستورات را به دستگاه تست ارسال کند، مجوزهای شبکه مورد نیاز را به فایل مانیفست در مجموعه منبع
androidTestاضافه کنید:<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />اگر تست شما اندروید ۱۷ (سطح API ۳۷) یا بالاتر را هدف قرار میدهد، باید مجوز
ACCESS_LOCAL_NETWORKرا نیز تعریف کنید:<uses-permission android:name="android.permission.ACCESS_LOCAL_NETWORK" />پرچم آزمایشی
enableEmulatorControlرا در فایلgradle.propertiesفعال کنید:android.experimental.androidTest.enableEmulatorControl=trueگزینه
emulatorControlرا در اسکریپت ساخت سطح ماژول فعال کنید:کاتلین
testOptions { emulatorControl { enable = true } }
گرووی
testOptions { emulatorControl { enable = true } }
در اسکریپت ساخت سطح ماژول، کتابخانه Espresso Device را به پروژه خود وارد کنید:
کاتلین
dependencies { androidTestImplementation("androidx.test.espresso:espresso-device:1.1.0") }
گرووی
dependencies { androidTestImplementation 'androidx.test.espresso:espresso-device:1.1.0' }
آزمایش در برابر تغییرات پیکربندی رایج
رابط برنامهنویسی کاربردی دستگاه اسپرسو (Espresso Device API) دارای چندین حالت جهتگیری صفحه نمایش و حالتهای تاشو است که میتوانید از آنها برای ایجاد تغییرات پیکربندی دستگاه استفاده کنید. مثالهای زیر نحوه ایجاد این حالتهای دستگاه و تأیید تغییرات رابط کاربری حاصل با استفاده از قوانین تست Compose را نشان میدهند.
تست چرخش صفحه نمایش
برای تست چرخش صفحه، میتوانید از کلاس ScreenOrientationRule برای تعریف جهت دستگاه در طول تست خود استفاده کنید.
در اینجا مثالی از نحوه آزمایش اینکه هنگام چرخش صفحه دستگاه چه اتفاقی برای برنامه شما میافتد، آورده شده است:
ابتدا، قانون تست Compose خود را تعریف کنید و از کلاس
ScreenOrientationRuleبرای تنظیم دستگاه روی یک حالت شروع ثابت (مانند حالت عمودی) استفاده کنید:import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertDoesNotExist import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithTag import androidx.test.espresso.device.EspressoDevice.onDevice import androidx.test.espresso.device.action.ScreenOrientation import androidx.test.espresso.device.rules.ScreenOrientationRule import org.junit.Rule import org.junit.Test class MyConfigurationTest { // 1. Define the Compose test rule @get:Rule val composeTestRule = createComposeRule() // 2. Define the Espresso Device rule for a consistent starting state @get:Rule val screenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT) }اگر تست شما اندروید ۱۷ (سطح API ۳۷) یا بالاتر را هدف قرار میدهد، Espresso Device API به مجوز
ACCESS_LOCAL_NETWORKنیاز دارد. شما باید قبل از اجرای قانونScreenOrientationRule، مطمئن شوید که این مجوز اعطا شده است. ابتداRuleChainمربوط به JUnit برای اجرای قانونGrantPermissionRuleاستفاده کنید:import androidx.test.rule.GrantPermissionRule import org.junit.rules.RuleChain class MyConfigurationTest { val grantPermissionRule = GrantPermissionRule.grant(android.Manifest.permission.ACCESS_LOCAL_NETWORK) val composeTestRule = createComposeRule() val screenOrientationRule = ScreenOrientationRule(ScreenOrientation.PORTRAIT) @get:Rule val chain = RuleChain .outerRule(grantPermissionRule) .around(composeTestRule) .around(screenOrientationRule) }آزمایشی ایجاد کنید که در حین اجرای آزمایش، جهت دستگاه را به حالت افقی (landscape) تنظیم کند:
@Test fun myRotationTest() { ... // Sets the device to landscape orientation during test execution. onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE) ... }پس از چرخش صفحه، از
composeTestRuleبرای بررسی انطباق composableهای خود با وضعیت جدید طبق انتظار استفاده کنید.@Test fun myRotationTest() { ... // Sets the device to landscape orientation during test execution. onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE) composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed() composeTestRule.onNodeWithTag("BottomBar").assertDoesNotExist() }
تست در برابر باز شدن صفحه نمایش
در اینجا مثالی از نحوه آزمایش اینکه اگر برنامه شما روی یک دستگاه تاشو باشد و صفحه نمایش آن باز شود، چه اتفاقی برای آن میافتد، آورده شده است:
ابتدا، با فراخوانی
onDevice().setClosedMode()دستگاه را در حالت تا شده آزمایش کنید. مطمئن شوید که کامپوننتهای شما با عرض صفحه نمایش فشرده سازگار میشوند.@Test fun myUnfoldedTest() { onDevice().setClosedMode() composeTestRule.onNodeWithTag("BottomBar").assertIsDisplayed() composeTestRule.onNodeWithTag("NavRail").assertDoesNotExist() ... }برای انتقال به حالت کاملاً باز شده، متد
onDevice().setFlatMode()را فراخوانی کنید. بررسی کنید که composableها با کلاس اندازه باز شده سازگار شوند.@Test fun myUnfoldedTest() { onDevice().setClosedMode() ... onDevice().setFlatMode() composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed() composeTestRule.onNodeWithTag("BottomBar").assertDoesNotExist() }
مشخص کنید که آزمایشهای شما به چه دستگاههایی نیاز دارند
اگر در حال اجرای آزمایشی هستید که اقدامات تا شدن را روی دستگاهی انجام میدهد که تاشو نیست، احتمالاً آزمایش با شکست مواجه خواهد شد. برای اجرای فقط آزمایشهایی که مربوط به دستگاه در حال اجرا هستند، از حاشیهنویسی @RequiresDeviceMode استفاده کنید. اجراکنندهی آزمایش به طور خودکار از اجرای آزمایشها روی دستگاههایی که از پیکربندی مورد آزمایش پشتیبانی نمیکنند، صرف نظر میکند. میتوانید قانون نیاز دستگاه را به هر آزمایش یا کل کلاس آزمایش اضافه کنید.
برای مثال، برای اینکه مشخص کنید یک تست فقط باید روی دستگاههایی اجرا شود که از پیکربندی تخت (flat) برای باز شدن پشتیبانی میکنند، کد @RequiresDeviceMode زیر را به تست خود اضافه کنید:
@Test
@RequiresDeviceMode(mode = FLAT)
fun myUnfoldedTest() {
...
}