الاختبار للتأكّد من التغييرات في إعدادات الشاشة باستخدام Espresso Device API

يمكنك استخدام Espresso Device API لاختبار تطبيقك عندما يخضع الجهاز لتغييرات شائعة في الإعدادات، مثل تدوير الشاشة وفتحها. تُعدّ Espresso Device API الأداة المقترَحة لمحاكاة الإجراءات على مستوى الجهاز إلى جانب قواعد اختبار Jetpack Compose. إذا كنت جديدًا على كتابة اختبارات واجهة المستخدم في Jetpack Compose، يمكنك الاطّلاع على مقالة اختبار تنسيق Compose.

تتيح لك Espresso Device API محاكاة تغييرات الإعدادات على جهاز افتراضي وتنفيذ اختباراتك بشكل متزامن، لذا لا يحدث سوى إجراء واحد أو تأكيد واحد على واجهة المستخدم في كل مرة، وتكون نتائج الاختبار أكثر موثوقية. إذا كنت جديدًا على كتابة اختبارات واجهة المستخدم باستخدام Espresso، يمكنك الاطّلاع على مستنداته.

لاستخدام Espresso Device API، تحتاج إلى ما يلي:

  • الإصدار Iguana أو إصدار أحدث من "استوديو Android"
  • الإصدار 8.3 أو إصدار أحدث من المكوّن الإضافي لنظام Gradle المتوافق مع Android
  • الإصدار 33.1.10 أو إصدار أحدث من "محاكي Android"
  • جهاز Android افتراضي يعمل بمستوى واجهة برمجة التطبيقات 24 أو إصدار أحدث

إعداد مشروعك لاستخدام Espresso Device API

لإعداد مشروعك بحيث يتوافق مع Espresso Device API، اتّبِع الخطوات التالية:

  1. للسماح للاختبار بتمرير الأوامر إلى الجهاز الاختباري، أضِف الإذنَين INTERNET وACCESS_NETWORK_STATE إلى ملف البيان في مجموعة رموز المصدر 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 في نص الإصدار على مستوى الوحدة:

    Kotlin

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      

    أنيق

      testOptions {
        emulatorControl {
          enable = true
        }
      }
      
  4. في نص الإصدار على مستوى الوحدة، استورِد مكتبة Espresso Device إلى مشروعك:

    Kotlin

    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. أنشِئ اختبارًا يضبط الجهاز على الوضع الأفقي أثناء تنفيذ الاختبار:

    @Test
    fun myRotationTest() {
      ...
      // Sets the device to landscape orientation during test execution.
      onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE)
      ...
    }
    
  3. بعد تدوير الشاشة، استخدِم composeTestRule للتحقّق من أنّ العناصر القابلة للإنشاء تتكيّف مع الحالة الجديدة على النحو المتوقّع.

    @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(). تأكَّد من أنّ العناصر القابلة للإنشاء تتكيّف مع فئة الحجم الموسَّعة.

    @Test
    fun myUnfoldedTest() {
      onDevice().setClosedMode()
      ...
      onDevice().setFlatMode()
      composeTestRule.onNodeWithTag("NavRail").assertIsDisplayed()
      composeTestRule.onNodeWithTag("BottomBar").assertDoesNotExist()
    }
    

تحديد الأجهزة التي تحتاج إليها اختباراتك

إذا كنت تُجري اختبارًا ينفّذ إجراءات الطي على جهاز غير قابل للطي، من المرجّح أن يفشل الاختبار. لتنفيذ الاختبارات ذات الصلة بالجهاز الذي يتم تشغيله فقط، استخدِم التعليق التوضيحي @RequiresDeviceMode. يتخطّى برنامج تشغيل الاختبار تلقائيًا تنفيذ الاختبارات على الأجهزة التي لا تتوافق مع الإعدادات التي يتم اختبارها. يمكنك إضافة قاعدة متطلبات الجهاز إلى كل اختبار أو إلى فئة اختبار كاملة.

على سبيل المثال، لتحديد أنّه يجب تشغيل الاختبار على الأجهزة التي تتيح فتح الشاشة إلى إعدادات مسطّحة فقط، أضِف رمز @RequiresDeviceMode التالي إلى اختبارك:

@Test
@RequiresDeviceMode(mode = FLAT)
fun myUnfoldedTest() {
  ...
}