استراتيجيات الاختبار

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

تحقّق الفِرق مستويات أعلى من الإنتاجية عند استخدام نهج منظَّم للاختبارات مع تحسينات في البنية الأساسية. ويتيح لك ذلك الحصول على ملاحظات في الوقت المناسب حول طريقة عمل الرمز البرمجي. تتضمّن استراتيجية الاختبار الجيدة ما يلي:

  • رصد المشاكل في أقرب وقت ممكن
  • يتم تنفيذها بسرعة.
  • تقديم مؤشرات واضحة عند الحاجة إلى إصلاح شيء ما

ستساعدك هذه الصفحة في تحديد أنواع الاختبارات التي يجب تنفيذها ومكان إجرائها وعدد مرّات إجرائها.

هرم الاختبار

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

تشير *الدقة إلى مدى تشابه بيئة وقت التشغيل التجريبية مع بيئة التشغيل الفعلي.

يتم عادةً عرض توزيع عدد الاختبارات حسب النطاق في شكل هرم.
الشكل 1. عادةً ما يتم عرض توزيع عدد الاختبارات حسب النطاق في شكل هرم.

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

تقليل تكلفة الخطأ

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

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

استراتيجية تركز على الاختبارات اليدوية، ولا يتم تنفيذ اختبارات الجهاز إلا ليلاً.
الشكل 2. استراتيجية تركز على الاختبارات اليدوية، ولا يتم تنفيذ اختبارات الجهاز إلا ليلاً.

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

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

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

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

استراتيجية اختبار قابلة للتوسّع

تم تقسيم هرم الاختبار تقليديًا إلى 3 فئات:

  • اختبارات الوحدات
  • اختبارات الدمج
  • اختبارات شاملة

ومع ذلك، لا تتوفّر تعريفات دقيقة لهذه المفاهيم، لذا قد تحتاج الفِرق إلى تحديد فئاتها بشكل مختلف، مثلاً باستخدام 5 طبقات:

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

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

النطاق

الوصول إلى الشبكة

التنفيذ

نوع الإصدار

مراحل النشاط

الوحدة

طريقة أو فئة واحدة مع الحد الأدنى من التبعيات

لا

بالتوقيت المحلي

قابل للتصحيح

الدمج المُسبَق

المكوّن

مستوى الوحدة أو المكوّن

صفوف متعددة معًا

لا

Local
Robolectric
Emulator

قابل للتصحيح

الدمج المُسبَق

الميزة

مستوى الميزة

التكامل مع المكوّنات التي تملكها فِرق أخرى

محاكاة

المحلي
Robolectric
أجهزة
المحاكي

قابل للتصحيح

الدمج المُسبَق

التطبيق

مستوى التطبيق

التكامل مع الميزات و/أو الخدمات التي تملكها فِرق أخرى

Mocked
خادم مرحلة الاختبار
خادم الإنتاج

أجهزة
المحاكي

قابل للتصحيح

ما قبل الدمج
ما بعد الدمج

الإصدار المحتمل

مستوى التطبيق

التكامل مع الميزات و/أو الخدمات التي تملكها فِرق أخرى

خادم الإنتاج

أجهزة
المحاكي

بنية إصدار مصغّرة


مرحلة ما قبل الإصدار بعد الدمج

تحديد فئة الاختبار

كقاعدة عامة، عليك مراعاة أدنى مستوى في الهرم يمكنه تقديم المستوى المناسب من الملاحظات إلى الفريق.

على سبيل المثال، فكِّر في كيفية اختبار تنفيذ هذه الميزة: واجهة المستخدم الخاصة بتدفق تسجيل الدخول. استنادًا إلى ما تريد اختباره، ستختار فئات مختلفة، مثل:

موضوع الاختبار

وصف ما يتم اختباره

فئة الاختبار

مثال على نوع الاختبار

منطق أداة التحقّق من صحة النماذج

فئة تتحقّق من صحة عنوان البريد الإلكتروني باستخدام تعبير عادي وتتأكّد من إدخال كلمة المرور. ليس له أي تبعيات.

اختبارات الوحدات

اختبار الوحدة المحلية لآلة JVM الافتراضية

سلوك واجهة مستخدم نموذج تسجيل الدخول

نموذج يتضمّن زرًا لا يتم تفعيله إلا بعد التحقّق من صحة النموذج

اختبارات المكوّنات

اختبار سلوك واجهة المستخدم الذي يتم تشغيله على Robolectric

مظهر واجهة مستخدم نموذج تسجيل الدخول

نموذج يتّبع مواصفات تجربة المستخدم

اختبارات المكوّنات

اختبار لقطات الشاشة لمعاينة Compose

التكامل مع أداة إدارة المصادقة

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

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

اختبار JVM باستخدام عناصر زائفة

مربّع حوار تسجيل الدخول

شاشة تعرض نموذج تسجيل الدخول عند الضغط على زر تسجيل الدخول

اختبارات التطبيق

اختبار سلوك واجهة المستخدم الذي يتم تشغيله على Robolectric

رحلة المستخدم الرئيسية: تسجيل الدخول

عملية تسجيل دخول كاملة باستخدام حساب تجريبي على خادم تجريبي

إصدار محتمل

اختبار سلوك واجهة مستخدم Compose الشامل الذي يتم تنفيذه على الجهاز

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

يُرجى العِلم أنّ فئة الاختبار لا تحدّد نوع الاختبار، وليس من الضروري اختبار جميع الميزات في كل فئة.

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

البنية الأساسية للاختبار

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

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

الفئة

البيئة (المكان)

المشغّل (عندما)

الوحدة

[محلية][4]

كل عملية إرسال

المكوّن

بالتوقيت المحلي

كل عملية إرسال

الميزة

المحاكي والأجهزة المحلية

قبل الدمج، أي قبل دمج تغيير أو إرساله

التطبيق

الأجهزة المحلية والمحاكيات وهاتف واحد وهاتف واحد قابل للطي

بعد الدمج، أي بعد دمج تغيير أو إرساله

الإصدار المحتمل

8 هواتف مختلفة وهاتف واحد قابل للطي وجهاز لوحي واحد

قبل الإصدار

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

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