تكرار السؤال: …
الإجابة المختصرة
هي الاختبارات التي تنجح وتفشل عشوائياً لنفس الكود دون أي تغيير؛ وتنتج عادة عن الاعتماد على توقيتات غير متزامنة، حالات مشتركة بين الاختبارات، أو تقلبات الاتصال الخارجي والشبكة.
الشرح
تعتبر الاختبارات المتقلبة سماً قاتلاً لثقة الفريق؛ لأن المطورين يبدأون في تجاهل فشل الـ CI والضغط على زر 'Re-run' حتى يمر الاختبار صدفة. الأسباب وعلاجها: (1) استخدام sleep/delay زمني ثابت بدلاً من انتظار الشروط صراحة (Await Polling / waitFor). (2) بقاء بيانات في الذاكرة أو قاعدة البيانات بين الاختبارات وعلاجها بالتنظيف التام بعد كل اختبار. (3) التبعيات على خدمات خارجية واستبدالها بـ Mocks ومحاكيات محلية (مثل WireMock / Testcontainers).
مثال بالكود
// خطأ يسبب Flakiness:
await sleep(1000); expect(result).toBeReady();
// كود قوي ومستقر:
await waitFor(() => expect(result).toBeReady(), { timeout: 5000 });أخطاء شائعة
- إخفاء مشكلة الاختبار المتقلب بإضافة إعادة محاولة آلية (Auto-retry 3 times) في إعدادات الـ CI بدلاً من إصلاح السبب الجذري للسباق في التزامن.