توضّح هذه الصفحة المبادئ الأساسية لاختبار تطبيقات Android، بما في ذلك أفضل الممارسات الأساسية ومزاياها.
مهارات Android
العرض على GitHubإنشاء استراتيجية اختبار
android skills add testing-setupمزايا الاختبار
تعد مرحلة الاختبار جزءًا لا يتجزأ من عملية تطوير التطبيقات. ويمكنك التحقّق من سلامة تطبيقك وفعالية وظائفه وسهولة استخدامه قبل إصداره للعلن من خلال إجراء سلسلة من الاختبارات على التطبيق بشكل منتظم.
يمكنك اختبار تطبيقك يدويًا من خلال التنقّل فيه. قد تستخدم أجهزة ومحاكيات مختلفة، وتغيّر لغة النظام، وتحاول إنشاء كل خطأ مستخدم أو اجتياز كل مسار مستخدم.
ومع ذلك، فإن الاختبار اليدوي لا يتناسب مع حجم التطبيق، وقد يكون من السهل إغفال الأخطاء في سلوك تطبيقك. الاختبار الآلي يتضمن استخدام الأدوات التي تجري الاختبارات نيابة عنك، وهو أسرع وأكثر قابلية للتكرار، وبشكل عام يمنحك المزيد من الملاحظات القابلة للتنفيذ حول تطبيقك في وقت مبكر من عملية التطوير.
أنواع الاختبارات في Android
تطبيقات الأجهزة الجوّالة معقّدة ويجب أن تعمل بشكل جيد في العديد من البيئات. على هذا النحو، هناك العديد من أنواع الاختبارات.
الموضوع
على سبيل المثال، هناك أنواع مختلفة من الاختبارات حسب الموضوع:
- الاختبار الوظيفي: هل يؤدي تطبيقي الوظيفة المطلوبة منه؟
- اختبار الأداء: هل يؤدي ذلك بسرعة وكفاءة؟
- اختبار أدوات تسهيل الاستخدام: هل يعمل التطبيق بشكل جيد مع خدمات تسهيل الاستخدام؟
- اختبار التوافق: هل يعمل التطبيق بشكل جيد على كل جهاز ومستوى واجهة برمجة تطبيقات؟
النطاق
تختلف الاختبارات أيضًا حسب الحجم أو درجة العزل:
- تتحقّق اختبارات الوحدات أو الاختبارات الصغيرة من جزء صغير جدًا من التطبيق، مثل طريقة أو فئة.
- تتحقّق اختبارات التحقّق من الصحة أو الاختبارات الكبيرة من أجزاء أكبر من التطبيق في الوقت نفسه، مثل شاشة كاملة أو مسار المستخدم.
- الاختبارات المتوسطة تقع بينهما وتتحقق من التكامل بين وحدتين أو أكثر.
هناك العديد من الطرق لتصنيف الاختبارات. ومع ذلك، فإن أهم تمييز لمطوري التطبيقات هو مكان إجراء الاختبارات.
الاختبارات الآلية مقابل الاختبارات المحلية
يمكنك إجراء الاختبارات على جهاز Android أو على كمبيوتر آخر:
- يتم إجراء الاختبارات لقياس حالة التطبيق على جهاز Android، سواء كان جهازًا فعليًا أو محاكيًا. يتم إنشاء التطبيق وتثبيته إلى جانب تطبيق اختباري يُدخل الأوامر ويقرأ الحالة. عادةً ما تكون الاختبارات الآلية هي اختبارات واجهة المستخدم، حيث يتم تشغيل التطبيق ثم التفاعل معه.
- يتم تنفيذ الاختبارات المحلية على جهاز التطوير أو الخادم، لذا تُعرف أيضًا باسم الاختبارات على جهاز المضيف. وعادةً ما تكون صغيرة وسريعة، وتعزل الموضوع قيد الاختبار عن بقية التطبيق.
ليست كل اختبارات الوحدات محلية، ولا يتم تشغيل جميع الاختبارات الشاملة على الجهاز. على سبيل المثال:
- الاختبار المحلي الكبير: يمكنك استخدام محاكي 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()))
واجهة مستخدم Compose
// 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)
بنية قابلة للاختبار
من خلال بنية التطبيق القابلة للاختبار، يتّبع الرمز البرمجي بنية تتيح لك اختبار أجزاء مختلفة منه بسهولة وبشكل منفصل. تتمتع البُنى القابلة للاختبار بمزايا أخرى، مثل سهولة القراءة والصيانة وقابلية التوسع وإعادة الاستخدام.
تؤدي البنية غير القابلة للاختبار إلى ما يلي:
- اختبارات أكبر وأبطأ وأكثر تفاوتًا قد يتعيّن تغطية الفئات التي لا يمكن اختبارها من خلال اختبارات الوحدة باختبارات تكامل أكبر أو اختبارات واجهة المستخدم.
- فرص أقل لاختبار سيناريوهات مختلفة تكون الاختبارات الأكبر أبطأ، لذا قد يكون اختبار جميع الحالات المحتملة للتطبيق غير واقعي.
لمزيد من المعلومات حول إرشادات البنية، يُرجى الاطّلاع على دليل بنية التطبيقات.
أساليب الفصل
إذا كان بإمكانك استخراج جزء من دالة أو فئة أو وحدة من الباقي، فإن اختباره يكون أسهل وأكثر فعالية. تُعرف هذه الممارسة باسم الفصل، وهي المفهوم الأكثر أهمية للبنية القابلة للاختبار.
تشمل أساليب الفصل الشائعة ما يلي:
- قسِّم التطبيق إلى طبقات، مثل "العرض التقديمي" و"النطاق" و"البيانات". يمكنك أيضًا تقسيم التطبيق إلى وحدات، واحدة لكل ميزة.
- تجنَّب إضافة منطق إلى الكيانات التي تحتوي على تبعيات كبيرة، مثل الأنشطة والأجزاء. استخدِم هذه الفئات كنقاط دخول إلى إطار العمل وانقل واجهة المستخدم ومنطق النشاط التجاري إلى مكان آخر، مثل دالة مركّبة أو ViewModel أو طبقة النطاق.
- تجنَّب الاعتماد المباشر على إطار العمل في الفئات التي تحتوي على منطق النشاط التجاري. على سبيل المثال، لا تستخدِم سياقات Android في ViewModels.
- اجعل التبعيات سهلة الاستبدال. على سبيل المثال، استخدِم الواجهات بدلاً من عمليات التنفيذ الملموسة. استخدِم حقن التبعية حتى إذا لم تكن تستخدم إطار عمل حقن التبعية.
الخطوات التالية
بعد أن تعرّفت على أهمية إجراء الاختبارات والنوعَين الرئيسيَين منها، يمكنك الاطّلاع على ما يجب اختباره أو التعرّف على استراتيجيات الاختبار.
بدلاً من ذلك، إذا أردت إنشاء أول اختبار لك والتعلّم من خلال الممارسة، يمكنك الاطّلاع على الدروس التطبيقية حول الترميز للاختبار.