الكود اشتغل مرة… هل ده معناه إنه صح؟ علّم ابنك يفكر زي مختبر البرامج
نُشر في
طالب كتب برنامج Python يحسب متوسط ثلاث درجات. جرّبه بالأرقام 80 و90 و100، والنتيجة طلعت 90.
مبسوط إن البرنامج اشتغل، فاعتبر المهمة خلصت.
لكن ماذا لو المستخدم كتب درجة سالبة؟ أو كتب كلمة بدل رقم؟ أو احتاج يحسب متوسط عدد مختلف من الدرجات؟
هنا بنكتشف فكرة مهمة في البرمجة: إن البرنامج يشتغل في تجربة واحدة مش معناه إنه هيشتغل صح في كل المواقف.
علشان كده اختبار البرامج مش خطوة إضافية بعد كتابة الكود، لكنه جزء من طريقة التفكير أثناء تطويره.
إيه الفرق بين تشغيل البرنامج واختباره؟
لما تشغّل برنامج وتشوف نتيجة، أنت بتلاحظ سلوكه.
أما الاختبار المنظم، فمعناه إنك تحدد قبل التجربة إيه النتيجة المتوقعة، وتختار مدخلات متنوعة، وتقارن الناتج الفعلي بالمتوقع.
مثلًا، لو عندنا دالة بتحسب سعر منتج بعد خصم 10%، نقدر نختبرها بسعر 100 جنيه، ونتوقع نتيجة 90 جنيه.
لكن اختبار واحد مش كفاية. ممكن نجرب سعر صفر، وسعر فيه كسور، ومدخلات غير صالحة.
فكّر في ثلاث أنواع من الحالات
ابدأ بالحالة العادية: المستخدم أدخل بيانات متوقعة.
بعدها جرّب الحالة الحدّية، أو Boundary Case، زي صفر أو أكبر قيمة مسموح بيها.
ثم جرّب المدخلات غير الصحيحة: كلمة بدل رقم، أو قيمة خارج الحدود اللي حددناها.
مش كل برنامج لازم يتعامل مع كل مدخل بنفس الطريقة. أحيانًا الأفضل إنه يرفض المدخل برسالة واضحة بدل ما يحسب نتيجة مضللة.
المهم إننا نحدد السلوك المطلوب قبل الاختبار.
تجربة Python بسيطة
تخيل إننا عايزين دالة ترجع «ناجح» لو الدرجة 50 أو أكثر، و«راسب» لو أقل من 50.
def result(score):
if not 0 <= score <= 100:
raise ValueError("Invalid score")
if score >= 50:
return "ناجح"
return "راسب"دلوقتي نجرب:
assert result(80) == "ناجح"
assert result(40) == "راسب"
assert result(50) == "ناجح"
assert result(0) == "راسب"
assert result(100) == "ناجح"كل سطر بيقارن النتيجة الفعلية بالنتيجة المتوقعة. لو المقارنة مش صحيحة، Python هيرفع AssertionError.
لاحظ إننا اختبرنا الدرجة 50 تحديدًا؛ لأنها الحد الفاصل بين النجاح والرسوب.
وللتأكد من رفض درجة غير صالحة، ممكن نستخدم unittest أو pytest لاختبار حدوث الاستثناء المتوقع.
إزاي نستخدم أدوات الاختبار؟
مكتبة unittest الموجودة مع Python بتوفر طريقة لتنظيم اختبارات متعددة، باستخدام أدوات زي assertEqual وassertRaises.
وفيه كمان pytest، وهي أداة مستقلة بتسمح بكتابة اختبارات بسيطة باستخدام assert، وبتعرض تفاصيل مفيدة لما اختبار يفشل.
المبتدئ مش محتاج يبدأ بأدوات معقدة. الأفضل يفهم الأول فكرة المدخلات والنتائج المتوقعة، وبعدها يتعلم ينظم الاختبارات.
نشاط عملي: اكتشف الخطأ قبل المستخدم
اعمل تحديًا بين طالبين.
الأول يكتب دالة لحساب تكلفة تذاكر، بشرط إن عدد التذاكر يكون رقمًا صحيحًا من صفر إلى عشرة.
الثاني ما يشوفش الكود في البداية؛ يكتب قائمة حالات لازم البرنامج يتعامل معاها: صفر، واحد، عشرة، أحد عشر، وعدد سالب، وقيمة نصية.
بعدها يجرّبوا الحالات ويقارنوا النتائج بالسلوك اللي اتفقوا عليه.
النشاط ده اقتراح تدريبي لتنمية التفكير التحليلي، مش اختبارًا علميًا لقدرات الطالب.
هل الاختبارات بتضمن إن البرنامج خالي من الأخطاء؟
لا. نجاح كل الاختبارات المكتوبة معناه إن البرنامج اجتاز الحالات اللي اختبرناها فقط.
ممكن تفضل فيه حالات ما فكرناش فيها، أو أخطاء في طريقة تحديد النتيجة المتوقعة نفسها.
علشان كده المبرمج الجيد بيسأل باستمرار: «إيه السيناريو اللي لسه ما جربتوش؟».
الخلاصة
كتابة الكود بتعلم الطالب إزاي يبني حلًا. أما اختبار الكود، فبيعلمه إزاي يشكك في افتراضاته، ويتحقق من النتائج، ويصلح الأخطاء بطريقة منظمة.
ودي مهارة تتجاوز البرمجة نفسها: ما نكتفيش إن الفكرة نجحت مرة، لكن نفهم إمتى تنجح، وإمتى تفشل، وليه.
المصادر والمراجع
- Python Documentation — unittest: Unit Testing Framework — تاريخ نشر الصفحة غير محدد
- pytest Documentation — Get Started — توثيق متجدد
- Python Documentation — doctest: Test Interactive Python Examples — توثيق متجدد
إعداد: فريق Techware Academy التعليمي · محتوى تثقيفي عام وتوصيات تطبيقية قابلة للتعديل حسب الطفل.
