هذا المقال يتطلب مستوى متوسط. بيفترض إنك بتكتب اختبارات آلية وتشغّل CI، وعارف يعني إيه pytest وGitHub Actions، ومش محتاج شرح أساسيات الاختبار.
الاختبار اللي بينجح مرة ويفشل مرة من غير ما تغيّر سطر واحد هو اللي بيخلّي فريقك يضغط "rerun" بدل ما يقرأ الخطأ. هنا هتبني أوتوميشن يمسك الاختبارات دي ويقيس تذبذبها بالأرقام قبل ما تتحوّل لعادة.
أتمتة كشف الاختبارات المتذبذبة: امسك flaky tests قبل ما تفقد ثقة فريقك
المشكلة باختصار
الـ CI بيطلع أحمر، بتفتح اللوج، تلاقي اختبار فشل. بتعيد التشغيل، يعدّي من غير ما تعمل حاجة. المشكلة مش في الكود اللي بتختبره — المشكلة إن الاختبار نفسه مش حتمي. ومع الوقت الفريق بيتعلّم إن الأحمر مش معناه مشكلة، فيبدأ يتجاهل الفشل الحقيقي كمان. دي أخطر نتيجة: انهيار الثقة في الـ CI كله.
يعني إيه اختبار متذبذب؟ (مثال بسيط الأول)
تخيّل إشارة مرور في تقاطع، بس بتقرّر لون النور برمي عملة معدنية مش بالتوقيت. نفس السيارة، نفس اللحظة، مرة بتعدّي ومرة بتقف. مش هتقدر تثق فيها ولا تخطّط على أساسها. الاختبار المتذبذب زيها بالظبط: نفس الكود، نفس المدخلات، ونتيجة بتتغيّر بين تشغيلة وتشغيلة.
علميًا: الاختبار المتذبذب (flaky test) هو اختبار بيدّي نتيجتين مختلفتين — نجاح وفشل — على نفس نسخة الكود بدون أي تغيير مقصود. السبب غالبًا اعتماد خفي على التوقيت (race condition)، أو ترتيب تنفيذ الاختبارات، أو مورد خارجي زي الشبكة أو ساعة النظام أو قاعدة بيانات مشتركة. المفتاح إنه غير حتمي (non-deterministic)، والحتمية هي أساس أي اختبار يُوثَق بيه.
ليه مش مجرد إزعاج: التكلفة الحقيقية
Google نشرت إن حوالي 16% من اختباراتها أظهرت مستوى من التذبذب في وقت ما. الرقم ده مش هامشي. خلّينا نحسبها على فريق أصغر: سويت فيها 800 اختبار، 6 منهم متذبذبين، وكل واحد بيفشل مرة كل 8 تشغيلات. ده بيخلّي حوالي 15% من مرات الـ pipeline تطلع حمراء بالغلط. لو الفريق 5 مطورين، والـ pipeline بتتشغّل 60 مرة في الأسبوع، دي حوالي 9 مرات حمراء كذب أسبوعيًا. كل واحدة بتاخد ~11 دقيقة تحقيق وإعادة تشغيل، يعني ~1.6 ساعة أسبوعيًا بتروح في اللاشيء — من غير حساب تكلفة إنك تتجاهل فشل حقيقي وسط الضوضاء.
الحل: شغّل السويت 15 مرة كل ليلة واحسب نسبة النجاح
الفكرة بسيطة: الاختبار الحتمي بيدّي نفس النتيجة في الـ 15 تشغيلة كلها. المتذبذب لأ. بدل ما تستنى الصدفة تكشفه في الإنتاج، شغّله كتير عن قصد كل ليلة، وسجّل مين اتذبذب. الشرح هنا مبني على فرضية إن سويت الاختبارات بتخلص في أقل من 5 دقائق وبتستخدم pytest.
الخطوات على أربع مراحل:
- شغّل السويت 15 مرة وخزّن نتيجة كل تشغيلة كملف JUnit XML.
- اقرأ الملفات واحسب لكل اختبار: كام مرة اتشغّل وكام مرة فشل.
- أي اختبار نسبة فشله بين 0 و100% (نجح مرة وفشل مرة) = متذبذب.
- ابعت القايمة على Slack، واعزل الأسوأ لحد ما يتصلّح.
أولًا، شغّل وجمّع النتائج في ملفات XML: