আপনার 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")
    }
}

এই টেস্টটি গ্রিন। এটি কোডটি রান করে, তাই আপনার কভারেজ ভালো দেখায়। কিন্তু টেস্টটি কেবল চেক করে যে ফলাফলটি শূন্যের চেয়ে কম কি না। আপনি যদি ডিসকাউন্টকে একটি গাণিতিক ভুলের (math error) মাধ্যমে পরিবর্তন করেন, তবুও টেস্টটি গ্রিন থাকবে। এটি আচরণ (behavior) চেক করে না। এটি কেবল চেক করে যে লাইট জ্বলছে কি না।

এটি একটি ফাঁদ। কভারেজ কেবল সেই লাইনগুলো গণনা করে যা আপনি স্পর্শ করেন। এটি গুরুত্বপূর্ণ অ্যাসারশনগুলো (assertions) গণনা করে না। একটি ৯০% কভারেজ রিপোর্ট ত্রুটিপূর্ণ কোড লুকিয়ে রাখতে পারে।

AI একটি গ্রিন লাইটের জন্য সংক্ষিপ্ততম পথ খোঁজে। এটি নরম অ্যাসারশন (soft assertions) এবং এমন মক (mocks) বেছে নেয় যা কিছুই টেস্ট করে না।

এটি ঠিক করতে একটি নিয়ম ব্যবহার করুন: টেস্টটি কীভাবে ফেইল করতে পারে তা পরীক্ষা করুন।

উদ্দেশ্যমূলকভাবে আপনার কোড পরিবর্তন করুন। যদি টেস্টটি গ্রিন থাকে, তবে সেই টেস্টটি অকেজো। সেটি ফেলে দিন।

একটি আসল টেস্ট দেখতে এমন হয়:

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

আপনি যদি লজিকটি ভেঙে ফেলেন, তবে এই টেস্টটি সাথে সাথে রেড (red) হয়ে যাবে। এটি কার্যকর।

আপনি প্রতিটি টেস্টের জন্য এটি হাতে করতে পারবেন না। পরিবর্তে মিউটেশন টেস্টিং (mutation testing) ব্যবহার করুন। Go-তে Gremlins-এর মতো টুলগুলো আপনার কোডে ছোট ছোট পরিবর্তন প্রয়োগ করে। তারা চেক করে যে আপনার টেস্টগুলো সেই পরিবর্তনগুলো ধরতে পারে কি না।

যদি কোনো পরিবর্তন একটি টেস্টকে ফেইল করাতে না পারে, তবে বুঝতে হবে আপনার টেস্ট সুইটে একটি ফাঁক রয়েছে।

আমি AI কোডের জন্য এটি ব্যবহার করি। আমি কোনো AI-কে তার কাজ শেষ হয়েছে বলে ঘোষণা করতে দিই না। আমি একটি গেট (gate) ব্যবহার করি। টুলটি কোড মিউটেশন (mutate) করে। যদি টেস্টটি গ্রিন থাকে, তবে AI-কে এটি পুনরায় লিখতে হবে। একটি টেস্ট ভালো কি না তা AI ঠিক করে না। মিউটেশন তা ঠিক করে দেয়।

কোনো AI টেস্ট আমার কোডবেসে প্রবেশ করে না যতক্ষণ না এটি প্রমাণ করে যে এটি ফেইল করতে পারে। যে টেস্ট ফেইল করতে পারে না, তা টেস্ট না থাকার চেয়েও খারাপ। একটি মিসিং টেস্ট স্পষ্ট বোঝা যায়। একটি ফেক (fake) টেস্ট বিপজ্জনক।

গ্রিন লাইটের ওপর ভরসা করা বন্ধ করুন। একটি টেস্ট কেবল তখনই মূল্যবান যখন এটি রেড (red) হতে পারে।

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

Optional learning community: https://t.me/GyaanSetuAi