ما هو اختبار الوحدة؟ التعريف والأمثلة

⚡ ملخص ذكي

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

  • 🎯 الهدف: الهدف هو الكشف عن الأخطاء في وحدة نمطية، وليس إثبات أن الوحدة النمطية تعمل.
  • ⚪ اتجاه: تعتمد هذه التقنية بشكل كبير على الصندوق الأبيض، مع استكمالها بحالات الصندوق الأسود المستمدة من المواصفات.
  • ⏩ تماثل: يمكن اختبار العديد من الوحدات في نفس الوقت، مما يقلل من نافذة الاختبار الإجمالية.
  • 🔗 طريقتان: يتم دمج الوحدات إما بشكل تدريجي، خطوة بخطوة، أو بشكل غير تدريجي في عملية واحدة.
  • 🧰 السقالات: تقوم برامج التشغيل بتزويد وحدة نمطية ببيانات الاختبار، بينما تحل البرامج الوهمية محل الوحدات النمطية التي تستدعيها.
  • ؟؟؟؟ ملكية: يكتب المختبرون اختبارات الوحدات بعد كتابة الكود، بينما يكتب المطورون اختبارات الوحدات أثناء كتابة الكود.
  • ⚠️ التحديات: إن العمل غير التدريجي، وسوء فهم بدائل الاختبار، وتصحيح الأخطاء المتكرر تستهلك معظم الجهد.

شرح اختبار الوحدات النمطية باستخدام الأساليب، وبرامج التشغيل، والنماذج الأولية، والمقارنات

ما هو اختبار الوحدة؟

اختبار الوحدة هو نوع من أنواع اختبار البرمجيات يفحص البرامج الفرعية أو الإجراءات أو الفئات أو العمليات الفردية في البرنامج. وبدلاً من اختبار البرنامج بأكمله دفعة واحدة، يوصي اختبار الوحدات باختبار المكونات الأصغر للبرنامج.

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

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

لماذا يجب القيام باختبار الوحدة؟

يوصى باختبار الوحدات النمطية لأنه يغير اقتصاديات اكتشاف العيوب.

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

كيفية القيام باختبار الوحدة؟

تصميم حالة اختبار يُعدّ اختبار الوحدات جزءًا مهمًا من عملية الاختبار. عند تصميم حالات الاختبار لاختبار وحدة ما، يجب على المختبِر مراعاة أمرين.

  • مواصفات الوحدة
  • الكود المصدري للوحدة

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

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

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

إن الاختيار بين الطريقتين هو عبارة عن مفاضلة بين جهد الإعداد وإمكانية التشخيص.

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

برامج التشغيل والبدائل في اختبار الوحدات

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

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

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

نصائح سبيل المثال لاختبار الوحدة

إليك بعض النصائح التي يجب مراعاتها قبل إجراء اختبار الوحدة.

  • Revراجع حالات الاختبار قبل استخدامها.
  • تجنب الالتباس بشأن مصدر التناقضات.
  • استخدم أدوات الاختبار الآلية.
  • افحص المتغيرات التي يجب أن تبقى دون تغيير.
  • قم بتبديل الوحدات بين المختبرين لتجنب الاختبارات الذاتية.
  • أعد استخدام حالات الاختبار.

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

اختبار الوحدة مقابل اختبار الوحدة

يتم استخدام المصطلحين بشكل متبادل في العديد من الفرق، ومع ذلك يختلف التأليف والنطاق.

اختبار الوحدة وحدة التجارب
اختبارات الوحدة هي مجموعة من الاختبارات التي يكتبها أحد المختبرين بعد كتابة بعض التعليمات البرمجية بواسطة أحد المطورين اختبارات الوحدة هي مجموعة من الاختبارات التي يكتبها المطور أثناء عملية تطوير البرمجيات
قد يتضمن اختبار الوحدة دمج اختبارات الوحدة قد يختبر اختبار الوحدة الوحدات بشكل منفصل

اختبار الوحدات مقابل اختبار المكونات مقابل اختبار التكامل

يقع اختبار الوحدات النمطية أيضًا بجوار مستويين متجاورين يسهل الخلط بينهما. يفصل الجدول بينهما حسب ما يتم اختباره والجهة التي تقوم به عادةً.

البعد اختبار الوحدة اختبار المكونات اختبار التكامل
تحت الاختبار برنامج فرعي واحد أو فئة أو إجراء واحد مكون واحد مكتفٍ ذاتيًا مع تبعياته المباشرة الواجهات بين الوحدات المدمجة
المالك المعتاد المُختبِر، بعد كتابة الكود اختبار مختبر التكامل
سقالة السائقون والقطع المتبقية نماذج أولية للاعتمادات الخارجية عدد أقل تدريجياً من الأشخاص الذين يستخدمون بدائل الاختبار
تم الكشف عن العيب خطأ منطقي داخل الوحدة خطأ في سلوك المكون خطأ في الواجهة وتمرير البيانات

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

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

هذه هي التحديات التي تواجهها الفرق في أغلب الأحيان عند إدخال اختبار الوحدات النمطية.

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

الأسئلة الشائعة

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

يقوم النموذج بقراءة مصدر الوحدة، وحصر الفروع، واقتراح حالة لكل منها، بما في ذلك قيم الحدود التي غالباً ما تغفلها عملية التمرير اليدوي. Revلا تزال عملية المراجعة ضرورية، لأن الحالات المولدة تؤكد ما يفعله الكود بدلاً من ما تتطلبه المواصفات.

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

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

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

اتبع الكود الموجود. يناسب أسلوب البرمجة من الأعلى إلى الأسفل المشاريع التي تُكتب فيها منطق التحكم أولاً ثم تُهيأ الوحدات النمطية الأدنى؛ بينما يناسب أسلوب البرمجة من الأسفل إلى الأعلى المشاريع التي تُوضع فيها وحدات الأدوات المساعدة أولاً ثم تستدعيها برامج التشغيل.

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

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

تلخيص هذه التدوينة بـ: