أنواع الاختبار ومستوياته
من الدالة الواحدة إلى التطبيق كاملًا: بأيّ مستوى نختبر، ولماذا؟ ⏱ نحو 35 دقيقة.
- تميّز مستويات الاختبار: وحدة، تكامل، نظام، قبول.
- تفرّق الوظيفي من غير الوظيفي.
- تفهم الصندوق الأسود والأبيض.
- تكتب اختبار صندوق أسود على حالات.
١هرم الاختبار: من الوحدة إلى القبول
لا نختبر كل شيء بالطريقة نفسها. الاختبار طبقاتٌ، كلٌّ منها يرى التطبيق من مستوى:
| المستوى | يختبر | مثال في متجر ويب |
|---|---|---|
| اختبار الوحدة Unit | دالة أو وحدة صغيرة بمعزل | دالة حساب الخصم |
| اختبار التكامل Integration | تعاون وحدتين أو أكثر | الطلب يُحفظ في قاعدة البيانات |
| اختبار النظام System | التطبيق كاملًا | رحلة شراء من البداية للنهاية |
| اختبار القبول Acceptance | هل يلبّي حاجة العميل؟ | يوافق العميل أن الميزة تمّت |
القاعدة: اختبارات الوحدة كثيرة وسريعة (القاعدة العريضة للهرم)، واختبارات النظام قليلة وبطيئة (القمّة). كلما نزلت، صار العثور على سبب العطل أسهل.
٢اختبار وظيفي أم غير وظيفي؟
| النوع | يسأل | أمثلة |
|---|---|---|
| وظيفي Functional | هل يفعل ما يجب؟ | الدخول، الحساب، الحفظ |
غير وظيفي Non-functional | كيف يفعله؟ | السرعة، الأمان، التحمّل، سهولة الاستخدام |
الاختبار الوظيفي يتحقّق من الصواب، وغير الوظيفي من الجودة: صفحةٌ تعطي النتيجة الصحيحة لكنها تأخذ عشر ثوانٍ فشلت غير وظيفيًّا. سنلمس الأداء في الدرس 16 والأمان في 21.
٣الصندوق الأسود والأبيض
زاويةٌ أخرى: هل نرى الكود الداخليّ أم لا؟
| المنهج | المُختبِر يرى | يركّز على |
|---|---|---|
| الصندوق الأسود | المدخلات والمخرجات فقط | السلوك الظاهر |
| الصندوق الأبيض | الكود الداخليّ | المسارات والفروع كلها |
# اختبار صندوق أسود: لا يهمّنا كيف تعمل، بل ماذا تُخرجdef is_valid_age(age): return 0 <= age <= 120 cases = [(25, True), (-1, False), (130, False), (0, True), (120, True)]passed = 0for age, expected in cases: if is_valid_age(age) == expected: passed += 1print("نجح", passed, "من", len(cases), "حالة")
اختبرنا الدالة من الخارج: مدخلاتٌ متنوّعة ونتائجها المتوقَّعة، دون النظر إلى كودها. هذا منهج الصندوق الأسود، وهو الأشيع.
توقّع وتحقّق
اختبار دالة واحدة بمعزل هو:
السرعة والأمان من الاختبار:
الاختبار الذي لا يرى الكود الداخليّ:
قاعدة هرم الاختبار (الأكثر):
الخلاصة
- الاختبار طبقات: الوحدة (كثيرة سريعة) حتى القبول (قليلة بطيئة).
- الوظيفي يتحقّق من الصواب، وغير الوظيفي من السرعة والأمان والتحمّل.
- الصندوق الأسود يرى المدخلات والمخرجات، والأبيض يرى الكود الداخليّ.
- كلما نزلت في الهرم سهُل تحديد سبب العطل.
تحدٍّ برمجي: صندوق أسود
تمهيدياختبر دالة is_even بمنهج الصندوق الأسود على حالاتٍ معطاة، واطبع عدد الحالات الناجحة.
- مرّ على الحالات وقارن ناتج الدالة بالمتوقَّع.
- اطبع عدد الحالات التي نجحت.
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
def is_even(n): return n % 2 == 0cases = [(4, True), (7, False), (0, True), (-2, True), (3, False)]# احسب واطبع عدد الحالات الناجحة
💡 تلميح 1
for n, expected in cases.💡 تلميح 2
is_even(n) == expected.حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
def is_even(n): return n % 2 == 0cases = [(4, True), (7, False), (0, True), (-2, True), (3, False)]passed = 0for n, expected in cases: if is_even(n) == expected: passed += 1print(passed)