तुमचे 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) चांगले दिसते. पण ही टेस्ट फक्त हे तपासते की रिझल्ट शून्यपेक्षा कमी आहे की नाही. जर तुम्ही डिस्काउंटमध्ये गणिताची चूक केली, तरीही ही टेस्ट ग्रीनच राहील. ती वर्तन (behavior) तपासत नाही. ती फक्त 'लाईट्स चालू आहेत का' (म्हणजे कोड रन होतोय का) हेच तपासते.
हा एक सापळा आहे. कव्हरेज म्हणजे तुम्ही स्पर्श केलेल्या ओळींची (lines) संख्या. पण महत्त्वाच्या 'असर्शन्स'ची (assertions) ती गणना करत नाही. ९०% कव्हरेज रिपोर्टमध्येही खराब कोड लपलेला असू शकतो.
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 सारखी टूल्स तुमच्या कोडमध्ये छोटे बदल करतात. तुमचे टेस्ट्स ते बदल पकडू शकतात का, हे ती तपासतात.
जर एखाद्या बदलामुळे टेस्ट फेल होत नसेल, तर तुमच्या टेस्ट सुईटमध्ये (test suite) त्रुटी आहे.
मी AI कोडसाठी हे वापरतो. मी AI ला त्याचे काम पूर्ण झाले असे जाहीर करू देत नाही. मी एक 'गेट' (gate) ठेवतो. टूल कोडमध्ये बदल (mutate) करते. जर टेस्ट ग्रीनच राहिली, तर AI ला ती पुन्हा लिहावी लागते. टेस्ट चांगली आहे की नाही हे AI ठरवत नाही, तर 'म्युटेशन' ठरवते.
जोपर्यंत एखादी AI टेस्ट फेल होऊ शकते हे सिद्ध होत नाही, तोपर्यंत ती माझ्या कोडबेसमध्ये प्रवेश करत नाही. जी टेस्ट फेल होऊ शकत नाही, ती टेस्ट नसण्यापेक्षाही वाईट आहे. टेस्ट नसणे हे स्पष्ट असते, पण बनावट टेस्ट धोकादायक असते.
'ग्रीन लाईट्स'वर विश्वास ठेवणे थांबवा. टेस्टची किंमत ती किती 'रेड' (fail) होऊ शकते यावर अवलंबून असते.
Source: https://dev.to/ohugonnot/your-ai-writes-tests-that-can-never-fail-3i57
पर्यायी लर्निंग कम्युनिटी: https://t.me/GyaanSetuAi
