طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 245 · ضمان جودة تطبيقات الويب
الدرس 4 · الوحدة 2: تحديد متطلبات الاختبار

حالات الاختبار: الصحيح والخطأ والحدّ

العيوب تختبئ في الأطراف؛ كيف نصمّم حالاتٍ تكشفها لا تمرّ بجانبها؟ ⏱ نحو 40 دقيقة.

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

١ثلاث فئات لا تنسَها

اختبارٌ واحدٌ بمدخلٍ «عاديّ» لا يكفي. العيوب تختبئ في الأطراف. لكل دالةٍ اختبر ثلاث فئات على الأقل:

الفئةتسألمثال: دالة قبول عمر 0–120
المسار الصحيح Happy pathهل تعمل مع المدخل المتوقَّع؟العمر 30 → مقبول
المسار الخاطئهل ترفض المدخل غير الصالح؟العمر 200 → مرفوض
الحدود Boundariesماذا عند أطراف المدى؟العمر 0 و120 و-1 و121

معظم العيوب على الحدود: هل 120 مقبول أم المدى حتى 119؟ هل الصفر مسموح؟ اختبار الحدود يكشف أخطاء «الأكبر من» مقابل «الأكبر من أو يساوي».

٢حالة اختبار منظّمة

حالة الاختبار الجيّدة: مدخل معلوم، وناتج متوقَّع محدّد، واسمٌ يصف ما تتحقّق منه. نجمعها جدولًا:

main.py
def is_valid_age(age):    return 0 <= age <= 120 # (الوصف، المدخل، المتوقَّع)cases = [    ("عمر عاديّ",      30,  True),    ("الحدّ الأدنى",    0,   True),    ("الحدّ الأعلى",    120, True),    ("تحت الأدنى",     -1,  False),    ("فوق الأعلى",     121, False),]for desc, age, expected in cases:    got = is_valid_age(age)    status = "✓" if got == expected else "✗ فشل"    print(f"{status}  {desc}: {age} -> {got}")
Shell×
>>> %Run main.py
✓ عمر عاديّ: 30 -> True
✓ الحدّ الأدنى: 0 -> True
✓ الحدّ الأعلى: 120 -> True
✓ تحت الأدنى: -1 -> False
✓ فوق الأعلى: 121 -> False
>>>

٣عدّاد النتائج

في الواقع لا نقرأ كل سطر؛ نريد خلاصة: كم نجح وكم فشل. وهذا ما تفعله أطر الاختبار:

main.py
def is_valid_age(age):    return 0 <= age <= 120 cases = [(30, True), (0, True), (120, True), (-1, False), (121, False), (60, True)]passed = sum(1 for age, exp in cases if is_valid_age(age) == exp)failed = len(cases) - passedprint("نجح:", passed, "| فشل:", failed)print("التغطية:", round(passed / len(cases) * 100), "% من الحالات مرّت")
Shell×
>>> %Run main.py
نجح: 6 | فشل: 0
التغطية: 100 % من الحالات مرّت
>>>

توقّع وتحقّق

أكثر العيوب تكمن عند:

حالة الاختبار الجيّدة تحوي:

المسار الصحيح Happy path يختبر:

حالتان متطابقتا السلوك:

الخلاصة

تحدٍّ برمجي: غطِّ الفئات

متوسط

دالة grade_pass تقبل درجة من 60 فأعلى. اختبرها على الحالات المعطاة (تشمل الحدّ 60) واطبع عدد الناجحة وعدد الفاشلة.

المطلوب:
  • مرّ على الحالات وقارن الناتج بالمتوقَّع.
  • اطبع عدد الحالات الناجحة ثم عدد الفاشلة.

ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:

main.py
def grade_pass(score):    return score >= 60cases = [(90, True), (60, True), (59, False), (0, False), (100, True)]# اطبع عدد الناجحة ثم عدد الفاشلة
المطلوب×
5
0
💡 تلميح 1
passed = sum(1 for s, exp in cases if grade_pass(s) == exp).
💡 تلميح 2
الفاشلة: len(cases) - passed.

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

main.py
def grade_pass(score):    return score >= 60cases = [(90, True), (60, True), (59, False), (0, False), (100, True)]passed = sum(1 for s, exp in cases if grade_pass(s) == exp)print(passed)print(len(cases) - passed)
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس