يمثل مورد عدم النشاط عملية غير متزامنة تؤثر نتائجها في العمليات اللاحقة في اختبار واجهة المستخدم. من خلال تسجيل الموارد غير النشطة باستخدام بالنسبة إلى اسبريسو، يمكنك التحقق من صحة هذه العمليات غير المتزامنة بشكل أكثر موثوقية عندما اختبار تطبيقك.
التعرّف على ما إذا كانت هناك حاجة إلى إيقاف الموارد
تقدم الإسبريسو مجموعة متطورة من
إمكانيات المزامنة. هذا النمط
إلا أن خاصية إطار العمل تنطبق فقط على العمليات التي يتم نشرها
الرسائل في النطاق MessageQueue
، مثل الفئة الفرعية من
View
يرسم محتواه على الشاشة.
وذلك لأنّ Espresso ليست على دراية بأيّ عمليات أخرى غير متزامنة، بما في ذلك المستخدمين الذين يعملون في سلسلة محادثات في الخلفية، فلن يتمكن Espresso من توفير المزامنة ضمانات في تلك المواقف. لإطلاع Espresso على ميزات تطبيقك طويلة الأمد، فيجب تسجيل كل واحدة منها كمورد لعدم النشاط.
إذا كنت لا تستخدم موارد عدم النشاط عند اختبار نتائج للعمل غير المتزامن، فقد تجد نفسك مضطرًا إلى استخدام أحد اتباع حلول بديلة خاطئة لتحسين اختباراتك الموثوقية:
- إضافة مكالمات إلى
Thread.sleep()
عندما تريد إضافة تأخيرات مصطنعة إلى اختباراتك، فإن مجموعة الاختبار تستغرق وقتًا أطول وقد تنتهي من التنفيذ، وقد تستمر اختباراتك في بعض الأحيان عند تنفيذها الأجهزة الأبطأ. بالإضافة إلى ذلك، لا تتوسّع هذه التأخيرات جيدًا، حيث قد يؤدي إجراء عمل غير متزامن أكثر استهلاكًا للوقت في إصدار مستقبلي. - تنفيذ برامج تضمين إعادة المحاولة، التي تستخدم تكرار حلقي للتحقق بشكل متكرر مما إذا كان قد تم لا يزال تطبيقك يؤدي عملاً غير متزامن إلى أن تنتهي المهلة. حتى إذا تحديد الحد الأقصى لعدد مرات إعادة المحاولة في اختباراتك، وتستهلك كل عملية إعادة تنفيذ موارد النظام، وخاصة وحدة المعالجة المركزية.
- عند استخدام أمثلة من
CountDownLatch
، يسمح لسلسلة واحدة أو أكثر بالانتظار حتى يتم إصدار عدد محدد من العمليات التي تم تنفيذها في سلسلة محادثات أخرى مكتملة. تتطلب منك هذه الكائنات تحديد طول المهلة وإلا فقد يتم حظر تطبيقك إلى أجل غير مسمى. المزالج تضيف أيضًا تعقيدات غير ضرورية إلى الرمز، ما يجعل الصيانة أكثر صعوبة.
تتيح لك Espresso إزالة هذه الحلول غير الموثوقة من الاختبارات وبدلاً من ذلك، يمكنك تسجيل العمل غير المتزامن لتطبيقك كموارد إيقاف التشغيل.
حالات الاستخدام الشائعة
عند إجراء عمليات مشابهة للأمثلة التالية في اختباراتك، ننصحك باستخدام مورد من مصادر عدم النشاط:
- جارٍ تحميل البيانات من الإنترنت أو مصدر بيانات محلّي.
- إنشاء اتصالات بقواعد البيانات وعمليات معاودة الاتصال.
- إدارة الخدمات، سواء باستخدام خدمة نظام أو نسخة من
IntentService
- تنفيذ منطق معقّد للنشاط التجاري، مثل عمليات تحويل الصور النقطية
من المهم بشكل خاص تسجيل موارد عدم النشاط عند إجراء هذه العمليات تعديل واجهة مستخدم تتحقّق منها اختباراتك.
مثال على عمليات تنفيذ الموارد غير النشطة
توضّح القائمة التالية عدة أمثلة على عمليات تنفيذ الموارد غير النشطة لفترة قصيرة. التي يمكنك دمجها في تطبيقك:
CountingIdlingResource
- يحافظ على عدّاد المهام النشطة. عندما يكون العدّاد صفرًا، يكون العداد المرتبط
يُعد المورد خاملاً. وتشبه هذه الوظيفة إلى حد كبير وظيفة
Semaphore
في معظم الحالات، يكون هذا التنفيذ كافيًا لإدارة العمل غير المتزامن لتطبيقك أثناء الاختبار. UriIdlingResource
- مماثل لـ
CountingIdlingResource
, ولكن يجب أن يكون العدّاد صفرًا لفترة زمنية محددة قبل يُعد المورد خاملاً. تستغرق فترة الانتظار الإضافية هذه دوال طلبات الشبكة في الاعتبار، حيث قد ينشئ أحد التطبيقات ضمن سلسلة المحادثات رسالة طلبك فور تلقّي ردّ على طلب سابق. IdlingThreadPoolExecutor
- تنفيذ مخصص لـ
ThreadPoolExecutor
تتتبّع العدد الإجمالي للمهام الجاري تنفيذها ضمن سلسلة المحادثات التي تم إنشاؤها بِرك طبيعية. يستخدم هذا الصفCountingIdlingResource
إلى الحفاظ على عدّاد المهام النشطة IdlingScheduledThreadPoolExecutor
- تنفيذ مخصص
ScheduledThreadPoolExecutor
إنه يوفر نفس الوظائف والإمكاناتIdlingThreadPoolExecutor
ولكن يمكنه أيضًا تتبع المهام التي تمت جدولتها للمستقبل أو لتنفيذه بشكل دوري.
إنشاء موردك الخاص أثناء الخمول
أثناء استخدام موارد عدم النشاط أثناء اختبارات تطبيقك، قد تحتاج إلى تقديم لإدارة الموارد المخصصة أو تسجيلها. في تلك الحالات، قد لا تتوفر عمليات التنفيذ المدرجة في القسم السابق كافيًا. إذا كان الأمر كذلك، يمكنك توسيع أحد عمليات تنفيذ موارد عدم النشاط هذه أو إنشاء مواردك الخاصة.
إذا استخدمت الوظائف الخاصة بك لتوفير مصادر عدم النشاط، اتّبِع أفضل ما يلي: الممارسات في الاعتبار، ولا سيما الأولى وهي:
- استدعاء عمليات النقل إلى حالة عدم النشاط خارج عمليات التحقق في وضع عدم النشاط
- بعد أن يصبح التطبيق غير نشِط لفترة قصيرة، يُرجى الاتصال
onTransitionToIdle()
خارج أي عمليات تنفيذisIdleNow()
بهذه الطريقة، لا تجري قهوة الإسبريسو أي لحظة، فهي تحقق غير ضروري لتحديد ما إذا كان مورد عدم النشاط غير مستخدَم حاليًا.
يوضِّح مقتطف الرمز التالي هذا الاقتراح:
Kotlin
fun isIdle() { // DON'T call callback.onTransitionToIdle() here! } fun backgroundWorkDone() { // Background work finished. callback.onTransitionToIdle() // Good. Tells Espresso that the app is idle. // Don't do any post-processing work beyond this point. Espresso now // considers your app to be idle and moves on to the next test action. }
Java
public void isIdle() { // DON'T call callback.onTransitionToIdle() here! } public void backgroundWorkDone() { // Background work finished. callback.onTransitionToIdle() // Good. Tells Espresso that the app is idle. // Don't do any post-processing work beyond this point. Espresso now // considers your app to be idle and moves on to the next test action. }
- سجِّل الموارد غير النشطة لفترة قصيرة.
لن تسري مزايا المزامنة المرتبطة بتغييرات عدم النشاط إلّا على الموارد بعد استدعاء Espresso لأول مرة
isIdleNow()
.تعرض القائمة التالية عدة أمثلة على هذا الموقع:
- إذا سجّلت موردًا في وضع عدم النشاط باستخدام طريقة تتضمّن تعليقات توضيحية باستخدام
@Before
، يسري ملجأ عدم النشاط في السطر الأول من كل اختبار. - في حال سجّلت موردًا في وضع عدم النشاط داخل أحد الاختبارات، سيَظهر لك ساريًا خلال الإجراء التالي المستند إلى الإسبريسو. لا يزال هذا السلوك تحدث حتى إذا كان الإجراء التالي في نفس اختبار العبارة التي تسجِّل مورد إيقاف التشغيل.
- إذا سجّلت موردًا في وضع عدم النشاط باستخدام طريقة تتضمّن تعليقات توضيحية باستخدام
- إلغاء تسجيل موارد عدم النشاط بعد الانتهاء من استخدامها
للحفاظ على موارد النظام، يجب إلغاء تسجيل موارد التوقف عن العمل في أقرب وقت ممكن. لأنك لست بحاجة إليها بعد الآن. على سبيل المثال، في حال تسجيل مورد عدم النشاط بطريقة بها تعليقات توضيحية باستخدام
@Before
، فمن الأفضل إلغاء تسجيل هذا المورد في طريقة مقابلة تمت إضافة تعليق توضيحي إليها باستخدام@After
.- استخدام قاعدة بيانات المسجّلين بدون تسجيل الدخول لتسجيل موارد التدخل بدون تسجيل أو إلغاء تسجيلها
باستخدام هذه الحاوية لموارد وضع عدم النشاط في تطبيقك، يمكنك التسجيل إلغاء تسجيل موارد التوقف عن العمل بشكل متكرر حسب الحاجة مع الحفاظ على اتساق السلوك.
- الحفاظ على حالة التطبيق البسيطة فقط ضمن موارد عدم النشاط
على سبيل المثال، ينبغي ألا تتضمن موارد التوقف عن العمل التي تنفذها وتسجلها تحتوي على إشارات إلى
View
عناصر.
تسجيل مصادر عدم النشاط
توفّر أداة Espresso فئة الحاوية التي يمكنك من خلالها وضع عدم نشاط تطبيقك
الموارد. هذا الفصل، يسمى
IdlingRegistry
، هو
أداة مستقلة تعمل على توفير الحد الأدنى من النفقات العامة لتطبيقك. الفئة
باتخاذ الخطوات التالية لتحسين
قابلية الصيانة:
- إنشاء مرجع إلى
IdlingRegistry
بدلاً من الموارد غير النشطة التي تحتوي عليها، في اختبارات تطبيقك. - حافِظ على الاختلافات في جمع الموارد التي تستخدمها بدون التأثير. لكل صيغة من صيغ الإصدار.
- تحديد الموارد غير النشطة لفترة قصيرة في خدمات تطبيقك، بدلاً من واجهة المستخدم والمكونات التي تشير إلى تلك الخدمات.
دمج الموارد في تطبيقك بدون أي نشاط
على الرغم من إمكانية إضافة موارد عدم النشاط إلى أحد التطبيقات بعدة طرق مختلفة، بشكل خاص إلى الحفاظ على تغليف تطبيقك مع السماح في الوقت نفسه في تحديد عملية معينة يمثلها مورد إيقاف تشغيل معين.
النهج المقترَح
عند إضافة موارد بدون توقف إلى تطبيقك، ننصحك بشدة بوضع عدم استخدام منطق الموارد في التطبيق نفسه وإجراء التسجيل عمليات إلغاء التسجيل في اختباراتك.
وعلى الرغم من أنك تسببت في وضع غير معتاد من استخدام واجهة للاختبار فقط في باتّباع هذه الطريقة، يمكنك التفاف الموارد حول الرمز البرمجي المتوفر لديك، مع الحفاظ على حجم حزمة APK لتطبيقك وعدد الطرق المطلوب
المناهج البديلة
في حال أردت عدم استخدام منطق بقاء الموارد في مرحلة الإنتاج داخل التطبيق، هناك العديد من استراتيجيات الدمج الأخرى المفيدة التالية:
- إنشاء صيغ للتصميم، مثل Gradle المنتج النكهات، ولا تستخدِم موارد النقر إلا في إصدار تصحيح الأخطاء في تطبيقك.
- استخدِم إطار عمل إدخال التبعية، مثل Dagger، لإدخال بيانات وضع عدم النشاط في تطبيقك. الرسم البياني لتبعية الموارد في اختباراتك. إذا كنت تستخدم Dagger 2، فإن يجب أن تنشأ الحاجة نفسها من مكون فرعي.
استخدام مصدر يعرض عدم النشاط أثناء اختبارات تطبيقك وكشف الجزء لتنفيذ تطبيقك ويحتاج إلى المزامنة في تلك الاختبار.
تحذير: على الرغم من أن قرار التصميم هذا يبدو وإنشاء مرجع مستقل للموارد غير النشطة، فإنه يفصل التغليف في جميع التطبيقات باستثناء أبسطها.
مصادر إضافية
لمزيد من المعلومات حول استخدام قهوة الإسبريسو في اختبارات Android، يُرجى الرجوع إلى الموارد التالية.
نماذج
- IdlingResourceSample: المزامنة مع المهام التي تعمل في الخلفية