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

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

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

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

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

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

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

  1. برای اینکه تست، دستورات را به دستگاه تست ارسال کند، مجوزهای شبکه مورد نیاز را به فایل مانیفست در مجموعه منبع 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" />
    
  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.1.0")
    }

    گرووی

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

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

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

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

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

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

  1. ابتدا، قانون تست 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)
    }
    
  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() {
  ...
}