يمكنك استخدام 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، اتّبِع الخطوات التالية:
للسماح للاختبار بتمرير الأوامر إلى الجهاز الاختباري، أضِف الإذنَين
INTERNETوACCESS_NETWORK_STATEإلى ملف البيان في مجموعة رموز المصدرandroidTest:<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />فعِّل العلامة التجريبية
enableEmulatorControlفي ملفgradle.properties:android.experimental.androidTest.enableEmulatorControl=trueفعِّل الخيار
emulatorControlفي نص الإصدار على مستوى الوحدة:Kotlin
testOptions { emulatorControl { enable = true } }
أنيق
testOptions { emulatorControl { enable = true } }
في نص الإصدار على مستوى الوحدة، استورِد مكتبة 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.
الاختبار في حال تدوير الشاشة
إليك مثال على كيفية اختبار ما يحدث لتطبيقك عند تدوير شاشة الجهاز:
أولاً، حدِّد قاعدة اختبار 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) }أنشِئ اختبارًا يضبط الجهاز على الوضع الأفقي أثناء تنفيذ الاختبار:
@Test fun myRotationTest() { ... // Sets the device to landscape orientation during test execution. onDevice().setScreenOrientation(ScreenOrientation.LANDSCAPE) ... }بعد تدوير الشاشة، استخدِم
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() }
الاختبار في حال فتح الشاشة
إليك مثال على كيفية اختبار ما يحدث لتطبيقك إذا كان على جهاز قابل للطي وتم فتح الشاشة:
أولاً، اختبِر الجهاز في الحالة المطوية من خلال طلب
onDevice().setClosedMode(). تأكَّد من أنّ العناصر القابلة للإنشاء تتكيّف مع عرض الشاشة الصغير.@Test fun myUnfoldedTest() { onDevice().setClosedMode() composeTestRule.onNodeWithTag("BottomBar").assertIsDisplayed() composeTestRule.onNodeWithTag("NavRail").assertDoesNotExist() ... }للانتقال إلى حالة فتح الشاشة بالكامل، اطلُب
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() {
...
}