تدقيق الاختبارات المُنشأة بواسطة الذكاء الاصطناعي: نصف مؤشرات CI الخضراء لا تثبت شيئاً
الاختبار الناجح يبدو وكأنه دليل، لكنه في العادة أقل مما تعتقد.
يؤكد الاختبار أن الكود يقوم بما يتوقعه الاختبار. إذا كان نفس المؤلف هو من كتب الكود والتوقعات معاً، فإن التوقعات ستتشكل بناءً على الكود. وبالتالي ينجح الاختبار لأنه كُتب لكي ينجح.
علامة الصح الخضراء تثبت أن اختباراتك تتوافق مع الكود، لكنها لا تثبت أن الكود صحيح.
تتفاقم هذه المشكلة عندما تقوم وكلاء الذكاء الاصطناعي (AI agents) بإرسال طلبات سحب (pull requests) كاملة؛ حيث يكتبون التنفيذ والاختبارات في خطوة واحدة. ولا تصبح علامة الصح أكثر موثوقية بمجرد تغيير المؤلف.
لقد قمت ببناء mirror_audit.py لسد هذه الفجوة. يقوم هذا الملف بقراءة مصدر الاختبار باستخدام AST، ولا يقوم بتشغيل الكود أبداً. إنه يبحث عن ثلاثة أنماط شائعة:
- إعادة الحساب (The Recompute): يستخدم الاختبار نفس الصيغة المستخدمة في الكود. إنه مجرد
f(x) == f(x)في ثوب مختلف. - القيمة الثابتة الذهبية (The Golden Literal): يستخدم الاختبار رقماً منسوخاً من تشغيل سابق. وهذا يربط الاختبار بما فعله الكود في اليوم الأول، بما في ذلك الأخطاء البرمجية.
- اختبار الدخان (The Smoke Test): يتحقق الاختبار مما إذا كانت النتيجة ليست
Noneولكنه يفتقر إلى تأكيد (assertion) حقيقي.
لقد قمت بتشغيل هذا ضد مجموعتين من الاختبارات (suites).
صُممت المجموعة الأولى لتعكس التنفيذ تماماً، وحصلت على نسبة انعكاس (mirror-ratio) بلغت 50.0%. فشل نظام الـ CI، حيث لم تحمل نصف الاختبارات أي إشارة مستقلة.
أما المجموعة الثانية فكانت صادقة؛ حيث استخدمت حالات سلبية (negative cases) وتوقعات مستقلة، وحصلت على نسبة 0.0%. نجح نظام الـ CI.
لا تقيس نسبة الانعكاس (mirror-ratio) معدل الأخطاء لديك، بل تقيس نقص الإشارات المستقلة. إنها تخبرك بمدى اعتماد نظام الـ CI الأخضر لديك على مجرد "إيماء" مجموعة الاختبارات مع الكود.
إذا قام الاختبار بحساب نفس النتيجة الخاطئة التي أنتجها التنفيذ، فسيظل الاختبار أخضر. أما إذا أكد الاختبار عقداً (contract) حقيقياً، فسيتحول إلى اللون الأحمر ويكتشف الخطأ.
توقف عن النظر إلى التغطية (coverage) فقط. اسأل نفسك: هل يمكن لاختباراتك أن تفشل بالفعل لسبب حقيقي؟
Source: https://dev.to/alex_spinov/audit-ai-generated-tests-half-of-green-ci-proves-nothing-4bmb
Optional learning community: https://t.me/GyaanSetuAi
