آپ کا AI ایسے ٹیسٹ لکھتا ہے جو کبھی فیل نہیں ہو سکتے
آپ AI سے ٹیسٹ مانگتے ہیں۔ وہ آپ کو بارہ گرین (کامیاب) ٹیسٹ دے دیتا ہے۔ آپ کا CI پاس ہو جاتا ہے۔ آپ کوڈ مرج کر دیتے ہیں۔ تین دن بعد، ایک بگ پروڈکشن میں پہنچ جاتا ہے۔ آپ ٹیسٹ دیکھتے ہیں۔ وہ پاس ہو گئے تھے، لیکن انہوں نے کچھ بھی ٹیسٹ نہیں کیا تھا۔
ایک گرین ٹیسٹ ثبوت نہیں ہے۔ یہ محض ایک مفروضہ ہے۔ 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)
}
}
اگر آپ لاجک (logic) کو توڑتے ہیں، تو یہ ٹیسٹ فوراً ریڈ ہو جاتا ہے۔ یہ اثر دکھاتا ہے۔
آپ ہر ٹیسٹ کے لیے یہ کام خود نہیں کر سکتے۔ اس کے بجائے میوٹیشن ٹیسٹنگ (mutation testing) کا استعمال کریں۔ Go میں Gremlins جیسے ٹولز آپ کے کوڈ میں چھوٹی تبدیلیاں کرتے ہیں۔ وہ چیک کرتے ہیں کہ آیا آپ کے ٹیسٹ ان تبدیلیوں کو پکڑ پاتے ہیں۔
اگر کوئی تبدیلی ٹیسٹ کو فیل نہیں کرتی، تو آپ کے ٹیسٹ سوٹ میں ایک خامی ہے۔
میں AI کوڈ کے لیے یہی طریقہ استعمال کرتا ہوں۔ میں AI کو یہ قرار نہیں دیتا کہ اس کا کام مکمل ہو گیا ہے۔ میں ایک گیٹ (gate) لگاتا ہوں۔ ٹول کوڈ کو میوٹیشن (mutate) کرتا ہے۔ اگر ٹیسٹ گرین رہتا ہے، تو AI کو اسے دوبارہ لکھنا پڑتا ہے۔ AI یہ فیصلہ نہیں کرتا کہ ٹیسٹ اچھا ہے یا نہیں۔ میوٹیشن فیصلہ کرتی ہے۔
کوئی بھی AI ٹیسٹ میرے کوڈ بیس میں اس وقت تک داخل نہیں ہوتا جب تک وہ یہ ثابت نہ کر دے کہ وہ فیل ہو سکتا ہے۔ وہ ٹیسٹ جو فیل نہیں ہو سکتا، وہ کسی ٹیسٹ کے نہ ہونے سے بھی بدتر ہے۔ ایک غائب ٹیسٹ واضح ہوتا ہے، لیکن ایک جعلی ٹیسٹ خطرناک ہوتا ہے۔
گرین لائٹس پر بھروسہ کرنا چھوڑ دیں۔ ایک ٹیسٹ کی اہمیت صرف اس 'ریڈ' (فیل ہونے) میں ہے جو وہ پیدا کر سکتا ہے۔
Source: https://dev.to/ohugonnot/your-ai-writes-tests-that-can-never-fail-3i57
Optional learning community: https://t.me/GyaanSetuAi
