أساسيات اختبار تطبيقات 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)

تحديد استراتيجية الاختبار

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

تجد استراتيجية الاختبار الجيدة توازنًا مناسبًا بين دقة الاختبار وسرعته وموثوقيته. يحدد تشابه بيئة الاختبار مع الجهاز الحقيقي دقة الاختبار. تعمل الاختبارات عالية الدقة على الأجهزة المحاكية أو الجهاز الفعلي نفسه. قد يتم تشغيل اختبارات الدقة المنخفضة على جهاز JVM لمحطة العمل المحلية. غالبًا ما تكون الاختبارات عالية الدقة أبطأ وتتطلب المزيد من الموارد، لذلك لا يجب أن يكون كل اختبار اختبارًا عالي الدقة.

اختبارات غير مستقرة

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

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

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

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

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

لمعرفة المزيد من المعلومات حول إرشادات البنية، يُرجى الاطّلاع على دليل بنية التطبيق.

أساليب فصل الاقتران

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

تشمل أساليب الفصل الشائعة ما يلي:

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

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

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

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