با API دستگاه Espresso در برابر تغییرات پیکربندی صفحه آزمایش کنید

از Espresso Device API برای آزمایش برنامه خود هنگام تغییرات پیکربندی رایج دستگاه، مانند چرخش و باز شدن صفحه، استفاده کنید. Espresso Device API ابزار پیشنهادی برای شبیه‌سازی اقدامات سطح دستگاه در کنار قوانین تست Jetpack Compose شماست. اگر در نوشتن تست‌های رابط کاربری برای Jetpack Compose تازه‌کار هستید، به بخش «تست طرح‌بندی Compose» مراجعه کنید.

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

برای استفاده از رابط برنامه‌نویسی کاربردی (API) دستگاه اسپرسو، به موارد زیر نیاز دارید:

  • اندروید استودیو ایگوانا یا بالاتر
  • افزونه اندروید Gradle نسخه ۸.۳ یا بالاتر
  • شبیه‌ساز اندروید ۳۳.۱.۱۰ یا بالاتر
  • دستگاه مجازی اندروید که API سطح ۲۴ یا بالاتر را اجرا می‌کند

پروژه خود را برای رابط برنامه‌نویسی کاربردی (API) دستگاه اسپرسو تنظیم کنید

برای تنظیم پروژه خود به گونه‌ای که از Espresso Device API پشتیبانی کند، موارد زیر را انجام دهید:

  1. برای اینکه تست، دستورات را به دستگاه تست ارسال کند، مجوزهای INTERNET و ACCESS_NETWORK_STATE را به فایل manifest در مجموعه منابع androidTest اضافه کنید:

      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
  2. پرچم آزمایشی enableEmulatorControl را در فایل gradle.properties فعال کنید:

      android.experimental.androidTest.enableEmulatorControl=true
    
  3. گزینه emulatorControl را در اسکریپت ساخت سطح ماژول فعال کنید:

    کاتلین

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      

    گرووی

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      
  4. در اسکریپت ساخت سطح ماژول، کتابخانه Espresso Device را به پروژه خود وارد کنید:

    کاتلین

    dependencies {
      androidTestImplementation("androidx.test.espresso:espresso-device:1.0.1")
    }

    گرووی

    dependencies {
      androidTestImplementation 'androidx.test.espresso:espresso-device:1.0.1'
    }

آزمایش در برابر تغییرات پیکربندی رایج

رابط برنامه‌نویسی کاربردی دستگاه اسپرسو (Espresso Device API) دارای چندین حالت جهت‌گیری صفحه نمایش و حالت‌های تاشو است که می‌توانید از آنها برای شبیه‌سازی تغییرات پیکربندی دستگاه استفاده کنید. مثال‌های زیر نحوه‌ی فعال‌سازی این حالت‌های دستگاه و تأیید تغییرات رابط کاربری حاصل با استفاده از قوانین تست Compose را نشان می‌دهند.

تست چرخش صفحه نمایش

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

  1. ابتدا، قانون تست Compose خود را تعریف کنید و دستگاه را روی یک حالت شروع ثابت (مانند حالت عمودی) تنظیم کنید:

    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)
    }
    
  2. آزمایشی ایجاد کنید که در حین اجرای آزمایش، جهت دستگاه را به حالت افقی (landscape) تنظیم کند:

    @Test
    fun myRotationTest() {
      ...
      // Sets the device to landscape orientation during test execution.
      onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE)
      ...
    }
    
  3. پس از چرخش صفحه، از 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()
    }
    

تست در برابر باز شدن صفحه نمایش

در اینجا مثالی از نحوه آزمایش اینکه اگر برنامه شما روی یک دستگاه تاشو باشد و صفحه نمایش آن باز شود، چه اتفاقی برای آن می‌افتد، آورده شده است:

  1. ابتدا، با فراخوانی onDevice().setClosedMode() دستگاه را در حالت تا شده آزمایش کنید. مطمئن شوید که کامپوننت‌های شما با عرض صفحه نمایش فشرده سازگار می‌شوند.

    @Test
    fun myUnfoldedTest() {
      onDevice().setClosedMode()
      composeTestRule.onNodeWithTag("BottomBar").assertIsDisplayed()
      composeTestRule.onNodeWithTag("NavRail").assertDoesNotExist()
      ...
    }
    
  2. برای انتقال به حالت کاملاً باز شده، متد 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() {
  ...
}