आपका AI ऐसे टेस्ट लिखता है जो कभी फेल नहीं हो सकते

आप AI से टेस्ट मांगते हैं। वह आपको बारह ग्रीन टेस्ट देता है। आपका CI पास हो जाता है। आप कोड मर्ज कर देते हैं। तीन दिन बाद, एक बग प्रोडक्शन में पहुँच जाता है। आप टेस्ट देखते हैं। वे पास हो गए थे, लेकिन उन्होंने कुछ भी टेस्ट नहीं किया था।

एक ग्रीन टेस्ट कोई प्रमाण नहीं है। यह केवल एक परिकल्पना (hypothesis) है। AI ऐसी परिकल्पनाएं लिखता है जो कभी फेल नहीं होतीं।

इस फंक्शन को देखें:

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

एक AI इस तरह का टेस्ट लिख सकता है:

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

यह टेस्ट ग्रीन है। यह कोड चलाता है, इसलिए आपका कवरेज (coverage) अच्छा दिखता है। लेकिन यह टेस्ट केवल यह जाँचता है कि परिणाम शून्य से कम है या नहीं। यदि आप डिस्काउंट को किसी गणितीय त्रुटि (math error) में बदल देते हैं, तब भी टेस्ट ग्रीन ही रहेगा। यह व्यवहार (behavior) की जाँच नहीं करता। यह केवल यह देखता है कि 'लाइट्स ऑन हैं' (यानी कोड चल रहा है)।

यह एक जाल है। कवरेज उन लाइनों को गिनता है जिन्हें आप छूते हैं। यह उन एसेर्शन (assertions) को नहीं गिनता जो मायने रखते हैं। 90% कवरेज रिपोर्ट भी खराब कोड को छिपा सकती है।

AI ग्रीन लाइट पाने का सबसे छोटा रास्ता चाहता है। यह ऐसे 'सॉफ्ट एसेर्शन' और 'मॉक्स' (mocks) चुनता है जो कुछ भी टेस्ट नहीं करते।

इसे ठीक करने के लिए, एक नियम अपनाएं: यह जाँचें कि क्या टेस्ट को पता है कि फेल कैसे होना है।

जानबूझकर अपने कोड को बदलें। यदि टेस्ट फिर भी ग्रीन रहता है, तो वह टेस्ट बेकार है। उसे फेंक दें।

एक असली टेस्ट ऐसा दिखता है:

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

यदि आप लॉजिक को तोड़ते हैं, तो यह टेस्ट तुरंत रेड (fail) हो जाएगा। यह असरदार है।

आप हर टेस्ट के लिए ऐसा मैन्युअल रूप से नहीं कर सकते। इसके बजाय 'म्यूटेशन टेस्टिंग' (mutation testing) का उपयोग करें। Go में Gremlins जैसे टूल्स आपके कोड में छोटे बदलाव करते हैं। वे जाँचते हैं कि क्या आपके टेस्ट उन बदलावों को पकड़ पाते हैं।

यदि कोई बदलाव टेस्ट को फेल नहीं कर पाता, तो इसका मतलब है कि आपके टेस्ट सूट में कोई कमी है।

मैं AI कोड के लिए इसका उपयोग करता हूँ। मैं AI को अपना काम पूरा घोषित नहीं करने देता। मैं एक 'गेट' (gate) लगाता हूँ। टूल कोड को म्यूटेट करता है। यदि टेस्ट ग्रीन रहता है, तो AI को उसे फिर से लिखना होगा। AI यह तय नहीं करता कि टेस्ट अच्छा है या नहीं। म्यूटेशन तय करता है।

कोई भी AI टेस्ट मेरे कोडबेस में तब तक प्रवेश नहीं करता जब तक वह यह साबित न कर दे कि वह फेल हो सकता है। जो टेस्ट फेल नहीं हो सकता, वह टेस्ट न होने से भी बदतर है। टेस्ट का न होना स्पष्ट होता है, लेकिन एक नकली टेस्ट खतरनाक होता है।

ग्रीन लाइट पर भरोसा करना बंद करें। एक टेस्ट की उपयोगिता केवल उस 'रेड' (failure) में है जो वह पैदा कर सकता है।

Source: https://dev.to/ohugonnot/your-ai-writes-tests-that-can-never-fail-3i57

वैकल्पिक लर्निंग कम्युनिटी: https://t.me/GyaanSetuAi