مهارة تثبيت الاختبارات المتقطّعة (Flaky Tests) — من فشل عشوائي إلى نتيجة حتمية
مهارة تشغيل جاهزة لوكلاء الكود (Claude Code وCursor وCodex وAntigravity) تعالج أكثر أعطال الاختبارات إرباكًا: الاختبار المتقطّع (Flaky) الذي ينجح أحيانًا ويفشل أحيانًا على نفس الكود دون أي تغيير، فيهزّ الثقة بمجموعة الاختبارات ويعطّل خطوط CI ويدفع الفرق للإعادة العمياء أو تعطيل الاختبار. تختلف هذه المهارة جوهريًا عن غيرها في السوق: فهي ليست «مهارة توليد اختبارات مركزة» (التي تكتب اختبارات جديدة بعد إصلاح عيب أو إضافة عقد)، ولا «مهارة Playwright E2E» (التي تؤلّف مسار متصفح كامل)، ولا «مهارة تعقّب الانحدار عبر git bisect» (التي تفترض اختبارًا حتميًا أصلًا وتطلب تثبيت المتقطّع قبلها) — بل هدفها تحديدًا تحويل اختبار قائم غير حتمي إلى حتمي بإزالة مصدر اللاحتمية لا إخفائه. تفرض المهارة منهجًا من خمس خطوات: (1) إعادة إنتاج التقطّع وقياس معدّل الفشل بتشغيل الاختبار عشرات إلى مئات المرات وبترتيب عشوائي وبالتوازي، لأن ما لا يُعاد إنتاجه لا يُصلَح بثقة؛ (2) عزل الاختبار المذنب بتشغيله منفردًا مقابل ضمن المجموعة لتمييز التقطّع الذاتي عن التلوث بحالة مشتركة أو اعتماد على ترتيب؛ (3) تصنيف السبب في إحدى سبع عائلات جذرية: سباقات التوقيت والتزامن (انتظار مدة ثابتة بدل انتظار شرط)، والاعتماد على الترتيب والحالة المشتركة بين الاختبارات، والوقت والتاريخ الحقيقي، والعشوائية بلا بذرة (random/UUID/ترتيب غير مضمون)، والشبكة وI/O الخارجي غير المعزول، وتنازع الموارد (منفذ أو ملف مؤقت أو اتصال قاعدة مشترك)، ودقة الأعداد العائمة والتوكيدات على مجموعات غير مرتّبة؛ (4) تطبيق الإصلاح الجذري المطابق للعائلة: انتظار الشرط لا الزمن، وعزل الحالة وتنظيفها قبل/بعد، وحقن ساعة قابلة للتجميد، وتثبيت بذرة العشوائية، وعزل الشبكة بـ stub وfixtures ثابتة، وتخصيص موارد فريدة لكل اختبار، والمقارنة ضمن هامش أو بعد ترتيب صريح؛ (5) التحقق بإعادة تشغيل الاختبار بنفس عدد إعادة الإنتاج وبترتيب عشوائي حتى ينجح 100% قبل الاعتماد. وتحكمها قواعد صارمة: لا يُعالَج التقطّع بإطالة sleep أو إعادة محاولة على مستوى الاختبار أو تعطيله/تخطّيه أو رفع عتبة القبول — فهذه إخفاء لا إصلاح؛ ولا يُخترع سبب تقطّع دون إثباته بإعادة الإنتاج؛ ويُقبل الحجر المؤقت (quarantine) فقط كإجراء عابر مع تذكرة تتبّع، لا كحلّ. مناسبة لإسكات ضجيج CI، وحماية الثقة بمجموعة الاختبارات، وتحويل الإجراء إلى SKILL.md داخل أدوات الوكلاء، وتعمل مع pytest وJest وVitest وGo test وغيرها.
منهج تشغيلي يحوّل اختبارًا متقطّعًا إلى حتمي: قياس معدّل الفشل بإعادة إنتاج التقطّع (تكرار + ترتيب عشوائي)، عزل الاختبار المذنب، تصنيف السبب في إحدى سبع عائلات جذرية، الإصلاح الجذري المطابق للعائلة (انتظار الشرط، عزل الحالة، حقن الساعة، تثبيت البذرة، عزل الشبكة، موارد فريدة، مقارنة ضمن هامش)، ثم التحقق بإعادة التشغيل حتى نجاح 100% — مع معدّل الفشل قبل وبعد، ودون إخفاء التقطّع بـ sleep أو إعادة محاولة أو تعطيل.