পাইথনে ইন্টারেষ্টিং বাগ; একই মেথডে ইউনিট টেস্ট সেটআপ আর টিয়ার-ডাউন
২৯ নভেম্বর ২০২৩, বুধবার
কাজের জায়গায় রিসেন্টলি একটা ইন্টারেষ্টিং বাগ ফেস করেছি, যেটা আমি নিজেই আসলে না জেনে তৈরী করেছিলাম। পাইথনে শেখা একটা নতুন জিনিস ব্যবহার করতে যেয়েই হয়তো (?) বাগটা কোডে ইন্ট্রোডিউসড হয়েছে। সেটাই প্রথমে লিখছি। তারপর আরেকটা নতুন জিনিস - যেটাও আসলে নতুন শিখলাম - কী করে একটা ইউনিট টেস্টের আগে সেটআপ (test setup) আর টেস্টের পরবর্তী টিয়ার-ডাউন (tear down) একই মেথডে করা যায়, সেটা লিখবো। খুব ছোট করেই লিখবো - কারণ এখন বেশ রাত, ঘুমানো দরকার।
প্রথম বিষয়: বাগ
ধরা যাক, নিচের কোডের মতো, আমাদের একটা সিম্পল {string: string } ডিকশেনারী আছে। আমাদের কাজ হচ্ছে, একটা key দেয়া হলে, তার করেস্পন্ডিং value প্রিন্ট করা - খুব সিম্পল ভাবে নিচের মতো করে কোডটা লেখা যায়:
ছবি: ১ |
ছবি ১'র লাইন-১০-এর কোড, একটু pythonic করা যায়, যেখানে একলাইনেই কন্ডিশন চেক, আর ভ্যালু এসাইনমেন্ট করা যায়। যেমন নিচের কোডের মতো [এই ব্যাপারটাই আমি নতুন শিখে ভেবেছিলাম ব্যবহার করি!]:
ছবি: ২ |
কিন্তু এই দুই কোডেই একটা বাগ আছে। কি ধরতে পারছেন? খুব suttle বা সুক্ষ একটা বাগ। একটা হিন্ট দেই, value যেহেতু string, কোনো একটা key'র রেস্পেক্টিভ value যদি empty string ("") হয়, তখন কি হবে? নিচের কোডে খেয়াল করুন:
ছবি: ৩ |
ছবি:৪ |
খেয়াল রাখতে হবে, ব্রাকেট বা পারেনথেসিস না দিলে কিন্তু আরেকটা বাগ তৈরী হবে; কী সেটা? সেটা না হয় নিজেরাই নিচের লিংকে গিয়ে কোড মোডিফাই করে, কোড রান করে দেখে নিন!
কোড: এই লিংকে
দ্বিতীয় বিষয়: পাইথন ইউনিট টেস্ট: একই মেথডে সেটআপ আর টিয়ার-ডাউন: একটু জটিল
কখনো কখনো ইউনিট টেস্ট কিছু সেটআপ করা লাগে। যেমন, ধরা যাক, আপনি একটা মেথড লিখেছেন, যেটা কিনা ডাটাবেস-র কোনো একটা টেবিলে একটা এন্ট্রি আপডেট করবে। এই মেথডের ইউনিট টেস্ট হিসাবে আপনি হয়তো চেক করবেন, মেথড কল করা হলে ডাটাবেসে একটা row updated হয় কিনা। ভালো কথা, কিন্তু ইউনিট টেস্টটা রান করার আগে আপনাকে তো নিশ্চিত করতে হবে যে ওই এন্ট্রিটা ডাটাবেসে আছে, ঠিক না? এন্ট্রি যদি না থাকে, তাহলে আপডেট করবেন কিভাবে? ইউনিট টেস্টটা তো ফেল করবে। আর, এই এন্ট্রিটা যে আছে, সেটা নিশ্চিত করার কাজটাই আপনাকে শুরুর সেটআপ মেথডে করে নিতে হবে।
আচ্ছা, যখন আপনার ইউনিট টেস্ট শেষ, এইবার সেটআপ-এ ইন্সার্ট করা ওই এন্ট্রি আপনাকে ডিলিট করতে হবে। এটাই টিয়ার-ডাউন (tear -down) প্রসেস।
আর এক সেটআপ আর টিয়ার-ডাউন করার দুইটা প্রসেসই একটা মেথড দিয়ে করা যায়! পাইথনে yield কীওয়ার্ড দিয়ে সেটা করা যায়, উদাহরণ হিসাবে নিচের কোডের টেম্পলেট দিচ্ছি:
ছবি: ৫: ইউনিট টেস্ট টেম্পলেট |
আশাকরি ব্যাপার দুইটা বোঝা গেছে! ধন্যবাদ!