وصل للفريق ملف اختبار من مئات الأسطر يعيد crash، لكن لا أحد يعرف أي جزء منه ضروري. كل محاولة يدوية لحذف أسطر تستهلك وقتاً وقد تزيل سبب العطل. يعرض هذا المشروع لطلاب هندسة البرمجيات خوارزمية لتقليل مدخل فاشل، ويحتفظ بسجل لكل حذف وتجربة. قدم Zeller وHildebrandt في بحثهما delta debugging طريقة منهجية لتقليل الحالة التي تسبب الفشل. وتشرح وثائق Hypothesis عن shrinking كيف يستفيد مولد الأمثلة من بنية الاستراتيجية للوصول إلى مدخل أبسط. لا تعد الأداة بإيجاد أقل حالة رياضياً في كل صيغة؛ معنى «صغير» يعتمد على عمليات التقليل والاختبار.

عرّف الفشل قبل تصغيره

يبدأ المختبر بدالة predicate تستقبل مدخلاً وتعيد واحدة من ثلاث نتائج: الفشل المستهدف تكرر، الاختبار نجح، أو التشغيل لم يحسم بسبب timeout أو crash مختلف. لا تخلط الحالة الثالثة بالنجاح أو بالفشل الأصلي. استخدم برنامجاً حتمياً صغيراً يرفض مدخلاً إذا احتوى حقلاً معيناً مع تركيبة قيمة محددة، واجعل له نسخة اختبار خفيفة. سجل معيار التعرف إلى نفس العطل، مثل exit code ورسالة مختارة وموضع معروف، ولا تكتف بعبارة «العملية لم تعمل».

اختَر وحدات قابلة للحذف

لملف نصي قد تكون الوحدة سطراً؛ ولـJSON تكون عنصراً من قائمة أو زوج مفتاح وقيمة؛ ولبرنامج تكون statement أو expression. اكتب adapter يحول المدخل إلى وحدات ويعيد بناءه بعد حذف subset. لا تقسم bytes عشوائياً إذا كان هذا يجعل كل candidate غير صالح نحوياً. في نسخة أولى استخدم قائمة سجلات JSON مستقلة كي يبقى كل candidate قابلاً للتحليل. دوّن أن خوارزمية عامة على النص قد تتخلص من بنية مهمة، بينما reducer واعٍ باللغة أغنى لكنه أصعب تنفيذاً.

اجعل محاولات ddmin ظاهرة

اقسم مجموعة الوحدات إلى أجزاء، احذف جزءاً، شغّل predicate، ثم قرر الاحتفاظ بالحذف أو إعادته. إذا لم يبق الفشل نفسه، اختبر المتممة أو ارفع دقة التقسيم إلى أجزاء أصغر. خزّن لكل تجربة candidate hash وعدد الوحدات ووقت التنفيذ والنتيجة. لا تضع قاعدة ثابتة تقول إن كل حذف يقرب من الحل؛ بعض المدخلات تحتاج مجموعات عناصر كي تسبب الحالة، وقد يتطلب التقليل محاولات كثيرة. أوقف التشغيل عند ميزانية زمن أو عدد محددة واحفظ أفضل candidate حتى تلك اللحظة.

مثال على ملف سجلات مصطنع

أنشئ قائمة من 16 حدثاً، واجعل العطل الاصطناعي يحدث إذا ظهر حدث commit بعد begin مع سجل وسيط قيمته lock=held. قد يقلص reducer القائمة تدريجياً حتى تبقى ثلاثة عناصر تكفي لإعادة النتيجة. المثال المتوقع يشرح الإجراء ولا يمثل إصلاح قاعدة بيانات حقيقية. تحقق من أن إعادة تشغيل الناتج عدة مرات تعيد الفشل المستهدف نفسه. إذا بقيت عناصر يمكن حذفها بحسب العمليات المعرفة، جرّب ترتيب وحدات مختلفاً أو افحص إن كانت وحدة الاختزال كبيرة أكثر من اللازم.

اشرح الفرق بين 1-minimal والأقل مطلقاً

إذا لم يعد حذف أي وحدة منفردة يحافظ على الفشل، فالناتج 1-minimal بالنسبة إلى الوحدات والpredicate؛ ولا يعني أن لا توجد مجموعة مختلفة أصغر تحافظ على الفشل. قد تعتمد النتيجة على ترتيب المحاولات وعلى قواعد تصغير الرقم أو السلسلة. أظهر هذا الفرق في واجهة التقرير حتى لا يسوق الطالب الناتج على أنه «أصغر مدخل ممكن». إرشادات Hypothesis تشرح أن المحرك يستفيد من بنية الاستراتيجية ويطبق ترتيباً خاصاً للتبسيط؛ reducer المتواضع لا يملك كل هذه المعرفة.

اختبر التذبذب والمخرجات المعيبة

اختبر مدخلاً لا يفشل، وفشلاً ثابتاً، وpredicate متقطعاً يتغير باحتمال، وtimeout، ومدخلاً لا يصح بعد حذف وحدة. عند ظهور نتائج مختلفة للمرشح نفسه أوقف التقليل أو أعد تشغيله عدداً محدوداً وحدد عدم الاستقرار. خزّن المخرجات في مجلد مؤقت لا فوق ملف الأصل. أضف حداً للمحاولات وحجم candidate ومدة كل تشغيل. لا تعرض «تم التقليل» إذا انتهت الميزانية دون تحقق أن الناتج ما زال يعيد الفشل. قارِن عدد استدعاءات predicate بالحجم النهائي، لا بزمن وهمي ثابت.

التسليم وحدود الأداة

يتكون المشروع من adapter لنوع مدخل واحد، reducer، سجل تجارب قابل للتصدير، وعرض يقارن الحالة الأصلية بالمختصرة. يرفق الطالب predicate وسيناريو اختبارات ومثالاً لا يفشل كي يوضح أن الأداة لا تخترع العطل. قد تكون عمليات التشغيل مكلفة أو غير حتمية، وقد يكون العطل مرتبطاً بالبيئة لا بالمحتوى وحده. لا تشغّل مدخلات غير موثوقة على جهاز شخصي دون عزل؛ النسخة التعليمية تستخدم fixtures داخلية وبرنامجاً محدوداً. تشرح إعدادات Hypothesis أن مرحلة shrinking قابلة للضبط، لكنها لا تضمن أن reducerك يطبق الاستراتيجية نفسها. يمكن إدراج الموضوع ضمن مشاريع تخرج وتطويره في المشاريع البرمجية الجامعية. القيمة هي شرح سلسلة الأدلة التي أبقت كل جزء، لا الوعد بتقليل آلي كامل لكل bug.

المصادر

مراجعة المصادر: .

اختبار المثال وحدوده

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

مقالات ذات صلة

الخدمة المرتبطة: تطوير المشاريع البرمجية الجامعية.

أرسل متطلبات مشروعك