حالات الاختبار: الصحيح والخطأ والحدّ
العيوب تختبئ في الأطراف؛ كيف نصمّم حالاتٍ تكشفها لا تمرّ بجانبها؟ ⏱ نحو 40 دقيقة.
- تختبر المسار الصحيح والخاطئ والحدود.
- تبني حالة اختبار بمدخل ومتوقَّع ووصف.
- تركّز على الحدود حيث العيوب.
- تلخّص النتائج بعدّاد نجاح وفشل.
١ثلاث فئات لا تنسَها
اختبارٌ واحدٌ بمدخلٍ «عاديّ» لا يكفي. العيوب تختبئ في الأطراف. لكل دالةٍ اختبر ثلاث فئات على الأقل:
| الفئة | تسأل | مثال: دالة قبول عمر 0–120 |
|---|---|---|
| المسار الصحيح Happy path | هل تعمل مع المدخل المتوقَّع؟ | العمر 30 → مقبول |
| المسار الخاطئ | هل ترفض المدخل غير الصالح؟ | العمر 200 → مرفوض |
| الحدود Boundaries | ماذا عند أطراف المدى؟ | العمر 0 و120 و-1 و121 |
معظم العيوب على الحدود: هل 120 مقبول أم المدى حتى 119؟ هل الصفر مسموح؟ اختبار الحدود يكشف أخطاء «الأكبر من» مقابل «الأكبر من أو يساوي».
٢حالة اختبار منظّمة
حالة الاختبار الجيّدة: مدخل معلوم، وناتج متوقَّع محدّد، واسمٌ يصف ما تتحقّق منه. نجمعها جدولًا:
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}")
٣عدّاد النتائج
في الواقع لا نقرأ كل سطر؛ نريد خلاصة: كم نجح وكم فشل. وهذا ما تفعله أطر الاختبار:
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), "% من الحالات مرّت")
توقّع وتحقّق
أكثر العيوب تكمن عند:
حالة الاختبار الجيّدة تحوي:
المسار الصحيح Happy path يختبر:
حالتان متطابقتا السلوك:
الخلاصة
- لكل دالة اختبر ثلاث فئات: المسار الصحيح، والمسار الخاطئ، والحدود.
- أكثر العيوب على الحدود (0، الأقصى، وما قبلهما وبعدهما).
- حالة الاختبار الجيّدة: مدخل معلوم، ومتوقَّع محدّد، ووصفٌ واضح.
- نوّع السلوك لا العدد؛ وحالتان متطابقتان زيادةٌ بلا قيمة.
تحدٍّ برمجي: غطِّ الفئات
متوسطدالة grade_pass تقبل درجة من 60 فأعلى. اختبرها على الحالات المعطاة (تشمل الحدّ 60) واطبع عدد الناجحة وعدد الفاشلة.
- مرّ على الحالات وقارن الناتج بالمتوقَّع.
- اطبع عدد الحالات الناجحة ثم عدد الفاشلة.
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
def grade_pass(score): return score >= 60cases = [(90, True), (60, True), (59, False), (0, False), (100, True)]# اطبع عدد الناجحة ثم عدد الفاشلة
💡 تلميح 1
passed = sum(1 for s, exp in cases if grade_pass(s) == exp).💡 تلميح 2
len(cases) - passed.حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
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)