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

معايير القبول ومعايير الخروج

متى نقول «الميزة مقبولة» و«الاختبار انتهى»؟ بمعاييرَ لا بالشعور. ⏱ نحو 40 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تفرّق بين معايير القبول والخروج.
  • تكتب معيار قبولٍ قابلًا للاختبار.
  • تحوّل قرار الإطلاق إلى معايير مقيسة.
  • تتّفق على «تمّ» سلفًا.

١متى نقول: تمّ؟

«هل انتهى الاختبار؟» سؤالٌ بلا جوابٍ ما لم نحدّد معاييرَ مسبقة. نعرّف بُعدين: معايير القبول (متى تُعَدّ الميزة ناجحة؟) ومعايير الخروج (متى نتوقّف عن الاختبار ونُطلِق؟).

المعياريجيب عنمثال
معايير القبول Acceptanceمتى تُقبَل الميزة؟المستخدم يكمل الشراء في أقلّ من 3 خطوات
معايير الخروج Exitمتى نتوقّف عن الاختبار؟لا عيوب حرجة، وتغطية ≥85%

بلا معايير، الاختبار إمّا يتوقّف مبكرًا (عيوبٌ تتسرّب) أو لا ينتهي أبدًا. المعايير تحوّل «شعور الجودة» إلى قرارٍ قابلٍ للقياس متّفقٍ عليه سلفًا.

٢معايير القبول كصيغة قابلة للاختبار

الصيغة الشائعة: Given-When-Then (بالعطاء-عندما-فإنّ). تحوّل المتطلّب إلى حالة اختبارٍ واضحة:

main.py
# معيار قبول: "بالعطاء سلّة فيها منتج، عندما يضغط دفع، فإنّ الإجمالي يشمل الشحن"def checkout_total(items_total, free_shipping_threshold=200):    shipping = 0 if items_total >= free_shipping_threshold else 15    return items_total + shipping # نحوّل المعيار إلى اختبارdef test_acceptance():    # Given سلّة بـ 100 (أقل من عتبة الشحن المجّانيّ)    # When الدفع    total = checkout_total(100)    # Then الإجمالي = 100 + 15 شحن    assert total == 115, f"المتوقَّع 115، الفعلي {total}" test_acceptance()print("✓ معيار القبول متحقّق")
Shell×
>>> %Run main.py
✓ معيار القبول متحقّق
>>>

معيار القبول ليس وصفًا غامضًا («يجب أن يعمل الدفع») بل شرطًا قابلًا للاختبار: مدخلٌ محدّد ونتيجةٌ متوقَّعة. هكذا يوافق العميل والفريق على تعريفٍ واحد لـ«تمّ».

٣معايير الخروج: قرار الإطلاق

قبل الإطلاق نفحص قائمةً متّفقًا عليها. نمثّلها دالةً تقرّر الجاهزية:

main.py
def ready_to_release(critical_bugs, coverage, tests_passing):    "قرار الإطلاق حسب معايير الخروج"    reasons = []    if critical_bugs > 0:         reasons.append("عيوب حرجة")    if coverage < 85:             reasons.append("تغطية دون 85%")    if not tests_passing:         reasons.append("اختبارات فاشلة")    return (not reasons), reasons ready, reasons = ready_to_release(critical_bugs=0, coverage=88, tests_passing=True)print("جاهز للإطلاق؟", ready) ready2, reasons2 = ready_to_release(critical_bugs=2, coverage=70, tests_passing=True)print("جاهز؟", ready2, "— الموانع:", reasons2)
Shell×
>>> %Run main.py
جاهز للإطلاق؟ True
جاهز؟ False — الموانع: ['عيوب حرجة', 'تغطية دون 85%']
>>>

توقّع وتحقّق

متى تُقبَل الميزة؟ يجيب عنه معيار:

متى نتوقّف عن الاختبار؟ يجيب عنه معيار:

صيغة معيار القبول الشائعة:

معايير الخروج تجعل قرار الإطلاق:

الخلاصة

تحدٍّ برمجي: قرار الإطلاق

متقدم

أكمل can_release: تعيد True فقط إن كانت العيوب الحرجة 0 والتغطية ≥ 85. اطبع قرار حالتين.

المطلوب:
  • أعِد True إن critical==0 وcoverage>=85.
  • اطبع قرار (0, 90) و(1, 90).

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

main.py
def can_release(critical, coverage):    # True فقط إن لا عيوب حرجة والتغطية >= 85    passprint(can_release(0, 90))print(can_release(1, 90))
المطلوب×
True
False
💡 تلميح 1
return critical == 0 and coverage >= 85.
💡 تلميح 2
عيبٌ حرجٌ واحد يمنع الإطلاق.

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

main.py
def can_release(critical, coverage):    return critical == 0 and coverage >= 85print(can_release(0, 90))print(can_release(1, 90))
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

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