ذكاؤك الاصطناعي يكتب اختبارات لا يمكن أن تفشل أبداً

تطلب من الذكاء الاصطناعي كتابة اختبارات، فيعطيك اثني عشر اختباراً ناجحاً (باللون الأخضر). يمر نظام التكامل المستمر (CI) بنجاح. تدمج الكود. بعد ثلاثة أيام، يصل خطأ (bug) إلى بيئة الإنتاج. تنظر إلى الاختبارات؛ لقد اجتازت الاختبارات، لكنها لم تختبر أي شيء فعلياً.

الاختبار الناجح ليس دليلاً، بل هو مجرد فرضية. والذكاء الاصطناعي يكتب فرضيات لا تفشل أبداً.

انظر إلى هذه الدالة:

func Discount(total int) int {
    if total > 100 {
        return total - 10
    }
    return total
}

قد يكتب الذكاء الاصطناعي هذا الاختبار:

func TestDiscount(t *testing.T) {
    got := Discount(150)
    if got < 0 {
        t.Errorf("result should not be negative")
    }
}

هذا الاختبار ناجح (green). إنه يشغل الكود، لذا تبدو نسبة التغطية (coverage) جيدة. لكن الاختبار يتحقق فقط مما إذا كانت النتيجة أقل من الصفر. إذا قمت بتغيير الخصم إلى خطأ رياضي، فسيظل الاختبار ناجحاً. إنه لا يتحقق من السلوك، بل يتحقق فقط مما إذا كانت الأضواء تعمل.

هذا فخ. التغطية (Coverage) تحسب الأسطر التي تلمسها، لكنها لا تحسب التأكيدات (assertions) ذات الأهمية. تقرير تغطية بنسبة 90% يمكن أن يخفي كوداً معطلاً.

يسعى الذكاء الاصطناعي إلى أقصر طريق للحصول على الضوء الأخضر. لذا يختار تأكيدات ضعيفة (soft assertions) ونماذج محاكاة (mocks) لا تختبر أي شيء.

لإصلاح ذلك، استخدم قاعدة واحدة: تأكد من أن الاختبار يعرف كيف يفشل.

قم بتغيير الكود الخاص بك عن قصد. إذا ظل الاختبار ناجحاً، فالاختبار عديم الفائدة. تخلص منه.

الاختبار الحقيقي يبدو هكذا:

func TestDiscount(t *testing.T) {
    if got := Discount(150); got != 140 {
        t.Errorf("Discount(150) = %d, want 140", got)
    }
}

إذا أفسدت المنطق، سيتحول هذا الاختبار إلى اللون الأحمر فوراً. إنه يكتشف الأخطاء بفعالية.

لا يمكنك القيام بذلك يدوياً لكل اختبار. استخدم اختبار الطفرات (mutation testing) بدلاً من ذلك. أدوات مثل Gremlins في لغة Go تطبق تغييرات صغيرة على الكود الخاص بك، وتتحقق مما إذا كانت اختباراتك تكتشف هذه التغييرات.

إذا لم يؤدِ التغيير إلى فشل الاختبار، فهذا يعني وجود ثغرة في مجموعة اختباراتك.

أنا أستخدم هذا مع الكود المكتوب بواسطة الذكاء الاصطناعي. لا أسمح للذكاء الاصطناعي بإعلان انتهاء عمله. بل أضع بوابة تدقيق (gate). تقوم الأداة بإجراء طفرات في الكود، وإذا ظل الاختبار ناجحاً، يجب على الذكاء الاصطناعي إعادة كتابته. الذكاء الاصطناعي لا يقرر ما إذا كان الاختبار جيداً، بل الطفرة هي التي تقرر.

لا يدخل أي اختبار ناتج عن الذكاء الاصطناعي إلى قاعدة الكود الخاصة بي دون إثبات قدرته على الفشل. الاختبار الذي لا يمكنه الفشل أسوأ من عدم وجود اختبار على الإطلاق. الاختبار المفقود أمر واضح، أما الاختبار الزائف فهو خطر.

توقف عن الثقة بالأضواء الخضراء. قيمة الاختبار تكمن فقط في اللون الأحمر الذي يمكنه إنتاجه.

المصدر: https://dev.to/ohugonnot/your-ai-writes-tests-that-can-never-fail-3i57

مجتمع تعليمي اختياري: https://t.me/GyaanSetuAi