أساسيات اختبار تطبيقات Android

توضِّح هذه الصفحة المبادئ الأساسية لاختبار تطبيقات Android، بما في ذلك أفضل الممارسات الأساسية وفوائدها.

مزايا الاختبار

تعد مرحلة الاختبار جزءًا لا يتجزأ من عملية تطوير التطبيقات. ويمكنك التحقّق من سلامة تطبيقك وفعالية وظائفه وسهولة استخدامه قبل إصداره للعلن من خلال إجراء سلسلة من الاختبارات على التطبيق بشكل منتظم.

يمكنك اختبار تطبيقك يدويًا من خلال التنقّل فيه. يمكنك استخدام أجهزة وأجهزة محاكاة مختلفة وتغيير لغة النظام ومحاولة إنشاء كل خطأ من أخطاء المستخدم أو اجتياز كل تدفق مستخدم.

ومع ذلك، لا يمكن توسيع نطاق الاختبار اليدوي بشكلٍ جيد، وقد يكون من السهل التغافل عن التراجع في أداء تطبيقك. ينطوي الاختبار الآلي على استخدام أدوات تُجري الاختبارات نيابةً عنك، ما يجعلها أسرع وقابلة لإعادة الإجراء بشكلٍ أكبر، وبشكلٍ عام، تمنحك ملاحظات أكثر قابلية للتنفيذ حول تطبيقك في مرحلة مبكرة من عملية تطويره.

أنواع الاختبارات في Android

التطبيقات المتوافقة مع الأجهزة الجوّالة معقّدة ويجب أن تعمل بشكل جيد في العديد من البيئات. ولذلك، هناك العديد من أنواع الاختبارات.

الموضوع

على سبيل المثال، هناك أنواع مختلفة من الاختبارات استنادًا إلى الموضوع:

  • الاختبار الوظيفي: هل يؤدي تطبيقي المهام المطلوبة منه؟
  • اختبار الأداء: هل يتم ذلك بسرعة وكفاءة؟
  • اختبار تسهيل الاستخدام: هل يعمل بشكل جيد مع خدمات تسهيل الاستخدام؟
  • اختبار التوافق: هل يعمل التطبيق بشكل جيد على كل الأجهزة ومستويات واجهة برمجة التطبيقات؟

المجال

تختلف الاختبارات أيضًا حسب الحجم أو درجة العزل:

  • تعمل اختبارات الوحدات أو الاختبارات الصغيرة على التحقق فقط من جزء صغير جدًا من التطبيق، مثل طريقة تنفيذ أو صف دراسي.
  • تُجري الاختبارات من البداية إلى النهاية أو الاختبارات الكبيرة عمليات تحقّق من أجزاء أكبر من التطبيق في الوقت نفسه، مثل شاشة كاملة أو مسار مستخدم.
  • تقع الاختبارات المتوسطة بين النوعَين السابقَين، وتتحقّق من الدمج بين وحدتَين أو أكثر.
يمكن أن تكون الاختبارات صغيرة أو متوسطة أو كبيرة.
الشكل 1: نطاقات الاختبار في تطبيق نموذجي

هناك العديد من الطرق لتصنيف الاختبارات. ومع ذلك، فإنّ أهم فرق بالنسبة إلى مطوّري التطبيقات هو مكان إجراء الاختبارات.

الاختبارات المستندة إلى الأدوات مقارنةً بالاختبارات المحلية

يمكنك إجراء الاختبارات على جهاز Android أو على جهاز كمبيوتر آخر:

  • يتم تشغيل الاختبارات المستندة إلى أدوات على جهاز Android، سواء كان جهازًا فعليًا أو جهازًا محاكيًا. يتم إنشاء هذا التطبيق وتثبيته إلى جانب تطبيق تجريبي يُدخِل الأوامر ويقرأ الحالة. عادةً ما تكون الاختبارات المستندة إلى الأدوات هي اختبارات واجهة المستخدم، حيث يتم تشغيل تطبيق ثم التفاعل معه.
  • يتم تنفيذ الاختبارات المحلية على جهاز التطوير أو الخادم، لذلك يُطلق عليها أيضًا الاختبارات من جهة المضيف. وعادةً ما تكون صغيرة وسريعة، ما يؤدي إلى عزل الجزء الذي يتم اختباره عن بقية التطبيق.
يمكن تنفيذ الاختبارات كاختبارات مزوّدة بأدوات على جهاز، أو كاختبارات محلية على جهاز التطوير.
الشكل 2: أنواع مختلفة من الاختبارات استنادًا إلى مكان إجرائها

وليست كل اختبارات الوحدة محلية، ولا يتم إجراء كل الاختبارات الشاملة على الجهاز. على سبيل المثال:

  • الاختبار المحلي الكبير: يمكنك استخدام محاكي 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)

بنية قابلة للاختبار

من خلال بنية التطبيق القابلة للاختبار، يتّبع الرمز بنية تتيح لك اختبار أجزاء مختلفة منه بشكل منفصل بسهولة. تتمتع التصاميم القابلة للاختبار بمزايا أخرى، مثل سهولة القراءة والصيانة والتوسّع مجددًا وإعادة الاستخدام.

وتُنتج البنية غير القابلة للاختبار ما يلي:

  • اختبارات أكبر وأبطأ وأكثر تعقيدًا أما الفئات التي لا يمكن اختبار الوحدات منها، فقد تحتاج إلى تغطية الصفوف التي لا يمكن اختبارها من خلال اختبارات تكامل أكبر أو اختبارات واجهة مستخدم.
  • فرص أقل لاختبار سيناريوهات مختلفة تكون الاختبارات الأكبر حجمًا أبطأ، لذلك قد لا يكون اختبار جميع الحالات المحتمَلة للتطبيق واقعيًا.

لمزيد من المعلومات عن إرشادات التصميم، اطّلِع على دليل بنية التطبيقات.

طرق الفصل

إذا كان بإمكانك استخراج جزء من دالة أو فئة أو وحدة من الباقي، يكون اختباره أسهل وأكثر فعالية. تُعرف هذه الممارسة باسم "الفصل"، وهو المفهوم الأكثر أهمية للبنية القابلة للاختبار.

تشمل تقنيات الفصل الشائعة ما يلي:

  • تقسيم التطبيق إلى طبقات، مثل العرض والنطاق والبيانات يمكنك أيضًا تقسيم التطبيق إلى وحدات، واحدة لكل ميزة.
  • تجنَّب إضافة منطق إلى الكيانات التي لها تبعيات كبيرة، مثل الأنشطة والمقاطع. استخدِم هذه الفئات كنقاط دخول إلى إطار العمل وانقل واجهة المستخدم ومنطق الأعمال إلى مكان آخر، مثل طبقة قابلة للتركيب أو ViewModel أو طبقة النطاق.
  • تجنَّب التبعيات المباشرة للإطار العملي في الفئات التي تحتوي على منطق النشاط التجاري. على سبيل المثال، لا تستخدِم سياقات Android في ViewModels.
  • اجعل التبعيات سهلة للاستبدال. على سبيل المثال، استخدم الواجهات بدلاً من عمليات التنفيذ الملموسة. استخدِم حقن التبعية حتى إذا كنت لا تستخدم إطار عمل حقن التبعية.

الخطوات التالية

بعد أن تعرّفت على سبب إجراء الاختبارات والنوعَين الرئيسيَين من الاختبارات، يمكنك قراءة العناصر التي يجب اختبارها أو الاطّلاع على استراتيجيات الاختبار.

بدلاً من ذلك، إذا كنت تريد إنشاء أول اختبار والتعلم من خلال الممارسة، يمكنك مراجعة الدروس التطبيقية حول اختبار الرموز البرمجية.