اختبار تطبيقات الجوال: المحاكيات والأجهزة الحقيقية
لقد انتهيت للتو من بناء تطبيق الجوال الخاص بك. يعمل بشكل مثالي على حاسوبك المحمول، والبناء موقّع وجاهز. تشعر بالرضا عن شحنه إلى المتجر. لكن ها هي الحقيقة غير المريحة: حاسوبك المحمول ليس هاتف المستخدم. ليس قريبًا حتى.
المستخدمون يشغلون تطبيقك على مئات الأجهزة المختلفة. أحجام شاشات مختلفة، إصدارات أنظمة تشغيل مختلفة، مستويات بطارية مختلفة، ظروف شبكة مختلفة، وتكوينات أجهزة مختلفة. خلل لا يظهر أبدًا على جهاز التطوير الخاص بك يمكن أن يتسبب في تعطل التطبيق على طراز هاتف معين. إصدار سيء واحد يمكن أن يدمر تقييم متجرك ويخسرك المستخدمين بين ليلة وضحاها.
اختبار تطبيقات الجوال ليس اختياريًا. لكن كيف تختبر، وأين تشغل هذه الاختبارات، يُحدث فرقًا كبيرًا في مقدار الثقة التي تحصل عليها فعليًا قبل الشحن.
طبقات الاختبار المهمة
اختبار الجوال ليس شيئًا واحدًا. إنه كومة من الطبقات، كل منها يلتقط أنواعًا مختلفة من المشاكل بسرعات مختلفة.
اختبارات الوحدة تقع في القاع. تتحقق من أن جزءًا واحدًا من السلوك يعمل بشكل صحيح. من منظور الجوال، هذا يعني الاختبار من نقطة دخول ذات معنى: هل يتفاعل ViewModel بشكل صحيح عندما ينقر المستخدم على زر؟ هل يعيد use case الناتج الصحيح لمدخل معين؟ أنت لا تختبر تفاصيل التنفيذ الداخلية. أنت تختبر السلوك القابل للملاحظة. اختبارات الوحدة سريعة، غالبًا في غضون ميلي ثانية. يمكنك تشغيلها عند كل تغيير في الكود في خط أنابيبك باستخدام محاكي. لا حاجة لجهاز مادي.
اختبارات التكامل تقع في المستوى الأعلى. تتحقق من كيفية عمل المكونات معًا. هل البيانات القادمة من API تُعرض بشكل صحيح على الشاشة؟ هل يعمل التخزين المحلي بعد تسجيل دخول المستخدم؟ هذه الاختبارات تحتاج إلى بيئة تشبه الجهاز الحقيقي. المحاكيات أو الأجهزة الحقيقية تعمل هنا، اعتمادًا على ما تدمجه.
اختبارات واجهة المستخدم تقع في القمة. تحاكي تفاعلات المستخدم الحقيقية: النقر على الأزرار، ملء النماذج، تمرير القوائم، والتحقق من ظهور العناصر المتوقعة على الشاشة. هذه الاختبارات هي الأقرب إلى ما يختبره المستخدمون فعليًا. وهي أيضًا الأبطأ والأكثر هشاشة. تغيير بسيط في التخطيط يمكن أن يكسرها. لكن عندما تنجح، تعلم أن التطبيق يعمل من منظور المستخدم.
كل طبقة لها مكانها. اختبارات الوحدة تعطيك ردود فعل سريعة. اختبارات التكامل تلتقط مشاكل التوصيل. اختبارات واجهة المستخدم تتحقق من التجربة. تحتاج الثلاثة، لكن لا تحتاج لتشغيلها جميعًا عند كل مشغل.
المحاكيات: سريعة لكنها ليست مثالية
المحاكيات (Android) والمحاكيات (iOS) هي أحصنة العمل لاختبار الجوال. إنها مجانية، سهلة التشغيل في خط أنابيب CI/CD، وجيدة بما يكفي لمعظم فحوصات المنطق والتخطيط.
يمكنك تشغيل اختبارات الوحدة، اختبارات التكامل، وحتى اختبارات واجهة المستخدم عليها. تُقلع بسرعة، تدعم إصدارات أنظمة تشغيل مختلفة، وتتيح لك محاكاة أحجام شاشات متنوعة. للتطوير اليومي والبنى الداخلية، عادة ما تكون كافية.
لكن لديها نقطة عمياء. المحاكيات لا تعيد إنتاج سلوك الجهاز الحقيقي. الأداء مختلف. استهلاك البطارية مختلف. استجابات الحساسات مختلفة. سلوك الشبكة على الخلوي مختلف. اختبار ينجح تمامًا على محاكي يمكن أن يفشل على جهاز مادي بسبب التوقيت، ضغط الذاكرة، أو خصائص الأجهزة الفريدة.
لجعل هذا عمليًا، إليك وظيفة GitHub Actions تنشئ محاكي Android، تنتظر حتى يُقلع، تشغل الاختبارات المُجهزة، وتجمع النتائج:
name: Android Instrumented Tests
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Create and start emulator
run: |
echo "no" | avdmanager create avd -n testDevice -k "system-images;android-33;google_apis;x86_64" --force
$ANDROID_HOME/emulator/emulator -avd testDevice -no-window -no-audio &
- name: Wait for emulator to boot
run: |
adb wait-for-device
adb shell settings put global window_animation_scale 0.0
adb shell settings put global transition_animation_scale 0.0
adb shell settings put global animator_duration_scale 0.0
- name: Run instrumented tests
run: ./gradlew connectedCheck
- name: Upload test results
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results
path: app/build/reports/androidTests/connected/
إذا اختبرت فقط على المحاكيات، فأنت تشحن بمعلومات جزئية.
مزارع الأجهزة: أجهزة حقيقية على نطاق واسع
هنا تأتي مزارع الأجهزة. مزرعة الأجهزة هي خدمة تمنحك وصولاً إلى هواتف وأجهزة لوحية حقيقية موجودة في مركز بيانات. ترفع تطبيقك، تشغل اختباراتك عبر عشرات الأجهزة في وقت واحد، وتحصل على تقرير يظهر ما نجح وما تعطل على كل جهاز.
الخيارات الشائعة تشمل Firebase Test Lab لكل من Android و iOS، و AWS Device Farm. هذه الخدمات تدعم نماذج أجهزة مختلفة، إصدارات أنظمة تشغيل، وأحجام شاشات. يمكنك دمجها مباشرة في خط أنابيب CI/CD الخاص بك. كل مرة يكتمل فيها بناء، يشغل خط الأنابيب اختبارات على أجهزة حقيقية قبل أن يصل التطبيق إلى المتجر.
مزارع الأجهزة تلتقط مشاكل تفوتها المحاكيات. أعطال على أجهزة محددة، مشاكل تخطيط على نسب شاشة غير معتادة، تدهور أداء على أجهزة أقدم. كما تعطيك لقطات شاشة وسجلات من كل تشغيل اختبار، مما يسهل تشخيص حالات الفشل.
لكن مزارع الأجهزة ليست مجانية. تكلف مالاً لكل تشغيل اختبار، والاختبارات تستغرق وقتًا أطول من اختبارات المحاكي. لا تريد تشغيل كل بناء فردي عبر مزرعة أجهزة. سيكون ذلك بطيئًا ومكلفًا.
متى تستخدم ماذا
القرار عملي، ليس أيديولوجيًا. استخدم المحاكيات لردود الفعل السريعة أثناء التطوير وللبنى الداخلية. استخدم مزارع الأجهزة استراتيجيًا قبل الإصدارات.
مخطط التدفق التالي يلخص البيئة الموصى بها لكل نوع اختبار بناءً على احتياجات السرعة والدقة:
إليك قاعدة عامة بسيطة:
- كل commit: شغل اختبارات الوحدة على محاكي.
- كل طلب سحب: شغل اختبارات الوحدة بالإضافة إلى اختبارات التكامل على محاكي.
- قبل إصدار تدريجي أو إصدار مرحلي: شغل مجموعة الاختبارات الكاملة على مزرعة أجهزة، تغطي مجموعة تمثيلية من الأجهزة.
المفتاح هو مطابقة كثافة الاختبار مع المخاطرة. إصلاح خلل صغير في ميزة داخلية لا يحتاج إلى تشغيل كامل لمزرعة الأجهزة. الإصدار الذي سيصل إلى آلاف المستخدمين يحتاج ذلك بالتأكيد.
قائمة تحقق عملية قبل تقديم المتجر
قبل أن تضغط على زر التقديم في لوحة تحكم متجر التطبيقات، راجع قائمة التحقق السريعة هذه:
- اختبارات الوحدة تنجح على محاكي لإصدارات أنظمة التشغيل المستهدفة.
- اختبارات التكامل تنجح لتدفقات المستخدم الرئيسية (تسجيل الدخول، عرض البيانات، التنقل).
- اختبارات واجهة المستخدم تنجح على محاكي واحد وجهاز مادي واحد على الأقل.
- اختبارات مزرعة الأجهزة تنجح لأفضل 5-10 نماذج أجهزة يظهر تحليلك أن المستخدمين يمتلكونها فعليًا.
- لا توجد تقارير تعطل أو ANR (التطبيق لا يستجيب) من تشغيل مزرعة الأجهزة.
- لقطات الشاشة من مزرعة الأجهزة تطابق التخطيطات المتوقعة عبر أحجام الشاشات المختلفة.
هذه القائمة ليست شاملة، لكنها تلتقط المشاكل الأكثر شيوعًا التي تتسرب إلى الإنتاج.
الخلاصة الملموسة
الاختبار على المحاكيات فقط يشبه اختبار قيادة سيارة في موقف سيارات. يخبرك أن المقود يعمل، لكنه لا يخبرك كيف تتعامل السيارة على الطريق السريع. مزارع الأجهزة تعطيك بيانات الطريق السريع. استخدم المحاكيات للسرعة ومزارع الأجهزة للثقة. أتمتة كليهما في خط أنابيبك، وستشحن أخطاء أقل وتنام بشكل أفضل في الليل.