توضّح هذه الصفحة المبادئ الأساسية لاختبار تطبيقات Android، بما في ذلك أفضل الممارسات المركزية وفوائدها.
مزايا الاختبار
تعد مرحلة الاختبار جزءًا لا يتجزأ من عملية تطوير التطبيقات. من خلال إجراء الاختبارات على تطبيقك بشكل منتظم، يمكنك التحقّق من سلامة تطبيقك وفعالية وظائفه وسلوك الإصدار وسهولة استخدامه قبل إصداره للعلن.
يمكنك اختبار تطبيقك يدويًا من خلال تصفّحه. يمكنك استخدام أجهزة وأجهزة محاكاة مختلفة، وتغيير لغة النظام، ومحاولة إنشاء كل خطأ مستخدم أو اجتياز كل تدفق مستخدم.
ومع ذلك، يختلف الاختبار اليدوي بشكل سيء، وقد يكون من السهل إغفاله التراجع في سلوك تطبيقك يتضمّن الاختبار الآلي استخدام أدوات التي تجري هذه الاختبارات نيابةً عنك، وهي طريقة أسرع وأكثر تكرارًا المزيد من الملاحظات القابلة للتنفيذ حول تطبيقك في مرحلة مبكرة من مرحلة التطوير الدفع.
أنواع الاختبارات في Android
تعد تطبيقات الأجهزة الجوّالة معقدة ويجب أن تعمل بشكل جيد في العديد من البيئات. بالنسبة مثل، هناك أنواع عديدة من الاختبارات.
الموضوع
على سبيل المثال، تتوفر أنواع مختلفة من الاختبارات استنادًا إلى الموضوع:
- الاختبار الوظيفي: هل ينفّذ تطبيقي ما من المفترض أن يفعله؟
- اختبار الأداء: هل يتم إجراء الاختبار بسرعة وكفاءة؟
- اختبار تسهيل الاستخدام: هل يعمل بشكل جيد مع خدمات تسهيل الاستخدام؟
- اختبار التوافق: هل يعمل بشكل جيد على كل جهاز ومستوى واجهة برمجة التطبيقات؟
المجال
تختلف الاختبارات أيضًا حسب الحجم أو درجة العزلة:
- تعمل اختبارات الوحدات أو الاختبارات الصغيرة على التحقق من جزء صغير جدًا من التطبيق فقط، مثل الطريقة أو الفئة.
- تعمل الاختبارات الشاملة أو الاختبارات الكبيرة على التأكد من صحة أجزاء أكبر من التطبيق في نفس الوقت، مثل الشاشة بأكملها أو تدفق المستخدم.
- توجد اختبارات متوسطة بين الحين والآخر والتحقق من الدمج بين اثنين أو المزيد من الوحدات.
![قد تكون الاختبارات صغيرة أو متوسطة أو كبيرة.](https://developer.android.com/static/training/testing/fundamentals/test-scopes.png?hl=ar)
هناك العديد من الطرق لتصنيف الاختبارات. ومع ذلك، فإن الاختلاف الأكثر أهمية لمطوّري التطبيقات هو مكان إجراء الاختبارات.
الاختبارات المستنِدة مقابل الاختبارات المحلية
يمكنك إجراء اختبارات على جهاز Android أو على كمبيوتر آخر:
- يتم إجراء اختبارات الآلة على جهاز Android، سواء كان فعليًا أو في وضع المحاكاة. يتم إنشاء هذا التطبيق وتثبيته جنبًا إلى جنب مع تطبيق تجريبي يُدخِل الأوامر يقرأ الحالة. عادةً ما تكون الاختبارات المعملية اختبارات واجهة المستخدم، وبدء تشغيل تطبيق ثم التفاعل معه.
- يتم تنفيذ الاختبارات المحلية على جهاز التطوير أو الخادم، بحيث يتم ويُطلق عليها أيضًا الاختبارات من جهة المضيف. عادة ما تكون صغيرة وسريعة، معزولة الشخص قيد الاختبار من بقية التطبيق.
![ويمكن إجراء الاختبارات كاختبارات أجهزة على أحد الأجهزة، أو كاختبارات محلية على جهاز التطوير.](https://developer.android.com/static/training/testing/fundamentals/instru-vs-local.png?hl=ar)
وليست كل اختبارات الوحدة محلية، ولا يتم إجراء كل الاختبارات الشاملة على الجهاز. بالنسبة مثال:
- اختبار محلي كبير: يمكنك استخدام محاكي Android يعمل محليًا، مثل باسم Robolectric.
- اختبار قياس حالة التطبيق: يمكنك التأكد من أنّ الرمز يعمل بشكل جيد باستخدام الخاصة بإطار العمل، مثل قاعدة بيانات SQLite. يمكنك إجراء هذا الاختبار على أجهزة متعددة للتحقق من التكامل مع إصدارات متعددة من SQLite.
أمثلة
توضح المقتطفات التالية كيفية التفاعل مع واجهة المستخدم في اختبار واجهة المستخدم المركبة الذي ينقر على أحد العناصر ويتحقق من أن غيره العنصر المعروض.
إسبرسو
// When the Continue button is clicked
onView(withText("Continue"))
.perform(click())
// Then the Welcome screen is displayed
onView(withText("Welcome"))
.check(matches(isDisplayed()))
إنشاء واجهة المستخدم
// When the Continue button is clicked
composeTestRule.onNodeWithText("Continue").performClick()
// Then the Welcome screen is displayed
composeTestRule.onNodeWithText("Welcome").assertIsDisplayed()
يعرض هذا المقتطف جزءًا من اختبار الوحدة لـ ViewModel (المحلي من جهة المضيف). الاختبار):
// Given an instance of MyViewModel
val viewModel = MyViewModel(myFakeDataRepository)
// When data is loaded
viewModel.loadData()
// Then it should be exposing data
assertTrue(viewModel.data != null)
تحديد استراتيجية الاختبار
في عالم مثالي، ستختبر كل سطر من الرموز البرمجية في تطبيقك على كل جهاز يتوافق معها تطبيقك. ولسوء الحظ، هذا النهج بطيء للغاية مكلفًا ليكون عمليًا.
تجد استراتيجية الاختبار الجيدة توازنًا مناسبًا بين دقة واختباره وسرعته وموثوقيته. تشابه بيئة الاختبار مع جهاز حقيقي يحدد دقة الاختبار. يتم إجراء الاختبارات عالية الدقة على الأجهزة التي تتم محاكاتها أو الجهاز الفعلي نفسه. قد يتم إجراء اختبارات بدقة أقل على آلة متجه الدعم في محطة العمل المحلية. غالبًا ما تكون الاختبارات عالية الدقة أبطأ تتطلب المزيد من الموارد، لذلك لا ينبغي أن يكون كل اختبار اختبارًا عالي الدقة.
اختبارات غير مستقرة
تحدث الأخطاء حتى في عمليات الاختبار التي تم تصميمها وتنفيذها بشكل صحيح. على سبيل المثال: عند إجراء اختبار على جهاز حقيقي، قد يبدأ التحديث التلقائي في في منتصف الاختبار ويتسبب في الإخفاق. قد تؤدي ظروف السباق الدقيقة في التعليمات البرمجية لا تحدث إلا في نسبة صغيرة من الوقت. الاختبارات التي لا تجتاز 100% من تكون غير مستقرة.
بنية قابلة للاختبار
مع بنية تطبيق قابلة للاختبار، تتبع التعليمات البرمجية هيكلاً يتيح لك لاختبار أجزاء مختلفة منها بمعزل عن غيرها بسهولة. تتمتع البِنى الهندسية القابلة للاختبار بمزايا أخرى، مثل سهولة القراءة الأفضل وقابلية الصيانة وقابلية التوسع لإعادة الاستخدام.
وتُنتج البنية غير القابلة للاختبار ما يلي:
- اختبارات أكبر وأبطأ وأكثر استقرارًا. قد تحتوي الصفوف التي لا يمكن اختبار الوحدة عليها أن يخضع لاختبارات تكامل أكبر أو اختبارات واجهة المستخدم.
- فرص أقل لاختبار سيناريوهات مختلفة. الاختبارات الأكبر أبطأ، ولذا فإن اختبار جميع الحالات المحتملة للتطبيق قد يكون غير واقعي.
لمزيد من المعلومات عن إرشادات البنية، يُرجى الاطّلاع على دليل التطبيق. الهندسة المعمارية.
طرق فك الاقتران
إذا كان بإمكانك استخراج جزء من دالة أو فئة أو وحدة من الباقي، فاختبر تكون أسهل وأكثر فعالية. وتُعرف هذه الممارسة باسم فصل الاقتران هو المفهوم الأكثر أهمية في البنية القابلة للاختبار.
وتشمل الأساليب الشائعة لإلغاء الاقتران ما يلي:
- قسِّم تطبيقًا إلى طبقات مثل العرض التقديمي والنطاق والبيانات. يمكنك كذلك تقسيم التطبيق إلى وحدات، وحدة لكل ميزة.
- تجنب إضافة منطق إلى الكيانات التي لديها تبعيات كبيرة، مثل الأنشطة والأجزاء. استخدم هذه الفئات كنقاط دخول إلى إطار العمل نقل واجهة المستخدم ومنطق الأعمال إلى مكان آخر، مثل قابل للتعديل أو نموذج عرض أو المجال.
- تجنَّب التبعيات المستندة إلى إطار العمل المباشرة في الصفوف التي تحتوي على منطق الأنشطة التجارية. على سبيل المثال، لا تستخدم سياق Android في ViewModels.
- تسهيل استبدال التبعيات. على سبيل المثال، استخدم الواجهات بدلاً من عمليات التنفيذ الملموسة. استخدام إدخال التبعية حتى في حال عدم استخدام إطار عمل DI.
الخطوات التالية
الآن بعد أن عرفت سبب أهمية الاختبار والنوعين الرئيسيين من الاختبارات، يمكنك يُرجى الاطّلاع على مقالة ما يجب اختباره.
أما إذا كنت تريد إنشاء اختبارك الأول والتعلم بالممارسة، فاستخدم اختبار الدروس التطبيقية حول الترميز