معايير القبول ومعايير الخروج
متى نقول «الميزة مقبولة» و«الاختبار انتهى»؟ بمعاييرَ لا بالشعور. ⏱ نحو 40 دقيقة.
- تفرّق بين معايير القبول والخروج.
- تكتب معيار قبولٍ قابلًا للاختبار.
- تحوّل قرار الإطلاق إلى معايير مقيسة.
- تتّفق على «تمّ» سلفًا.
١متى نقول: تمّ؟
«هل انتهى الاختبار؟» سؤالٌ بلا جوابٍ ما لم نحدّد معاييرَ مسبقة. نعرّف بُعدين: معايير القبول (متى تُعَدّ الميزة ناجحة؟) ومعايير الخروج (متى نتوقّف عن الاختبار ونُطلِق؟).
| المعيار | يجيب عن | مثال |
|---|---|---|
| معايير القبول Acceptance | متى تُقبَل الميزة؟ | المستخدم يكمل الشراء في أقلّ من 3 خطوات |
| معايير الخروج Exit | متى نتوقّف عن الاختبار؟ | لا عيوب حرجة، وتغطية ≥85% |
بلا معايير، الاختبار إمّا يتوقّف مبكرًا (عيوبٌ تتسرّب) أو لا ينتهي أبدًا. المعايير تحوّل «شعور الجودة» إلى قرارٍ قابلٍ للقياس متّفقٍ عليه سلفًا.
٢معايير القبول كصيغة قابلة للاختبار
الصيغة الشائعة: Given-When-Then (بالعطاء-عندما-فإنّ). تحوّل المتطلّب إلى حالة اختبارٍ واضحة:
# معيار قبول: "بالعطاء سلّة فيها منتج، عندما يضغط دفع، فإنّ الإجمالي يشمل الشحن"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("✓ معيار القبول متحقّق")
معيار القبول ليس وصفًا غامضًا («يجب أن يعمل الدفع») بل شرطًا قابلًا للاختبار: مدخلٌ محدّد ونتيجةٌ متوقَّعة. هكذا يوافق العميل والفريق على تعريفٍ واحد لـ«تمّ».
٣معايير الخروج: قرار الإطلاق
قبل الإطلاق نفحص قائمةً متّفقًا عليها. نمثّلها دالةً تقرّر الجاهزية:
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)
توقّع وتحقّق
متى تُقبَل الميزة؟ يجيب عنه معيار:
متى نتوقّف عن الاختبار؟ يجيب عنه معيار:
صيغة معيار القبول الشائعة:
معايير الخروج تجعل قرار الإطلاق:
الخلاصة
- معايير القبول تحدّد متى تُقبَل الميزة، ومعايير الخروج متى نتوقّف ونُطلِق.
- معيار القبول قابلٌ للاختبار
(Given-When-Then)، لا وصفٌ غامض. - معايير الخروج (لا عيوب حرجة، تغطية كافية، اختبارات خضراء) تجعل الإطلاق قرارًا مقيسًا.
- الاتفاق على المعايير سلفًا يمنع التسرّع والجدل عند الموعد.
تحدٍّ برمجي: قرار الإطلاق
متقدمأكمل can_release: تعيد True فقط إن كانت العيوب الحرجة 0 والتغطية ≥ 85. اطبع قرار حالتين.
- أعِد True إن
critical==0وcoverage>=85. - اطبع قرار
(0, 90)و(1, 90).
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
def can_release(critical, coverage): # True فقط إن لا عيوب حرجة والتغطية >= 85 passprint(can_release(0, 90))print(can_release(1, 90))
💡 تلميح 1
return critical == 0 and coverage >= 85.💡 تلميح 2
حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
def can_release(critical, coverage): return critical == 0 and coverage >= 85print(can_release(0, 90))print(can_release(1, 90))