GO — টেস্টিং ও টেস্ট ড্রিভেন ডেভলপমেন্ট(TDD)

ধরুন আপনার একটা সফটওয়্যার ডেভলপমেন্ট কোম্পানি আছে। যেখানে আপনি চাচ্ছেন হাই কোয়ালিটি সফটওয়্যার সল্যুশন বানাতে। তো আপনি ভালো স্যালারি দিয়ে ভালো ভালো ডেভলপার, ডিজাইনার, আর্কিটেক্ট/এনালিস্ট রাখলেন। তারা খুব দারুন সফটওয়্যার বানাচ্ছে।

আপনাদের একটা সফটওয়্যার মার্কেটে রিলিজ দিলেন। কিন্ত দেখা গেলো ইউজারদের কাছ থেকে অনেক অভিযোগ পাওয়া যাচ্ছে। এরপর আপনি আফসোস করলেন “নাহ, রিলিজ দেওয়ার আগে আমাদের ভালোমত পরীক্ষা করার দরকার ছিলো সফটওয়্যারটি ঠিকমত কাজ করে কিনা”

আপনার মত এই উপলব্ধি থেকে সফটওয়্যার পরীক্ষা বা টেস্টিং এর সূচনা। সফটওয়্যার টেস্টিং সফটওয়্যার ইঞ্জিনিয়ারিং এর আবশ্যিক কাজ।

সফটওয়্যার টেস্টিং কি?

সহজ ভাষায় বলতে গেলে, কোনো সিস্টেম কি ঠিকমত ট্যাকনিকালি কাজ করছে কিনা, আর নন-ট্যাকনিকালি ইউজারের চাহিদামত কাজ করছে কিনা এসব বিষয় পরীক্ষা নীরিক্ষা করাকেই টেস্টিং বলে। এতে করে কোনো সমস্যা থাকলে তা বের হয়ে আসবে আগে থেকেই।

টেস্টিং কেনো করবো?

সমস্যা আগে ভাগে পাওয়া গেলে ভালো? নাকি একদম শেষে গিয়ে পেলে ভালো? উপরের উদাহরণেই দেখুন, নিয়ম মত টেস্টিং না করার কারণে সফটওয়্যারটি প্রচন্ড বাগ নিয়ে রিলিজ হয়েছে। এখন এই বাগ গুলি খুজে খুজে ধরে ধরে বের করা অনেক অনেক সময় সাপেক্ষ আর ব্যায়বহুল। তাই ডেভলপমেন্ট এর প্রতিটা স্টেজে টেস্টিং করলে আগে ভাগেই সমস্যা ধরা পড়বে এবং ফিক্সও করা যাবে। আমি এমনও অনেক প্রজেক্ট জানি যেগুলি রিলিজ দেবার পর এত পরিমাণ বাগ ছিল যে তারা প্রজেক্ট ক্লোজ করতে বাধ্য হয় নতুবা প্রজেক্ট পুনরায় শুরু করতে বাধ্য হয়।

ওকে বুঝলাম টেস্টিং কি, আর এটাও বুঝলাম কেনো করতে হবে। কিন্ত কিভাবে করবো, কয়টা করবো, কখন করবো?

টেস্টিং কিভাবে করবো?

আপনি নিজে বসে বসে করতে পারেন, যাকে বলে ম্যানুয়াল টেস্টিং। যেমনঃ নতুন কিছু যোগ করলে আপনি রান করে নিজে নিজে চালিয়ে দেখলেন সব ঠিক আছে কিনা। অথবা আপনি না চাইলে টেস্ট করার দায়িত্বটা একজন টেস্টারকে দিতে পারেন

কিন্ত এটা সময় সাপেক্ষ আর ভুলও হতে পারে। এর চেয়ে ভালো হয় টেস্টিং এর দায়িত্বটা আমরা কম্পিউটারকে দিয়ে দেই। যাকে বলে অটোম্যাটিক টেস্টিং।

কখন টেস্ট করবো?

আসলে এটা ডিপেন্ড করে আপনি কোন প্রসেস মডেলে সফটওয়্যার ডেভলপমেন্ট করছেন তার উপর। উদাহরণ স্বরূপ এজাইল মেথডলজির এক্সট্রিম প্রোগ্রামিং প্রসেস মডেলে টেস্ট ড্রিভেন ডেভলপমেন্ট প্র্যাকটিসকে গুরুত্ব দেয়া হয়। অর্থাৎ কোড লিখার আগে টেস্ট করবেন, এরপর কোড লিখবেন। এখানে কোড আপনাকে ড্রাইভ করবে না, বরং টেস্ট আপনাকে ড্রাইভ করবে।

কিন্ত স্ক্রামে প্রতিটা স্প্রিন্ট এর শেষ দিকে কোডিং এর পর টেস্টিং করা হয়

যে প্রসেস মডেলেই আগান না কেনো, আপনাকে টেস্টিং করতেই হবে রিলিজ এর আগে।

কয় ধরনের টেস্ট আছে?

প্রথমেই জেনে নিই টেস্টিং এর মেথড নিয়ে। ৩ ধরনের মেথড আছেঃ

০১. ব্ল্যাক বক্স টেস্টিং

০২. হোয়াইট বক্স টেস্টিং

০৩. গ্রে বক্স টেস্টিং

ব্ল্যাক বক্স টেস্টিং এ সাধারণত নন-প্রোগ্রামাররা টেস্ট করে থাকেন যারা সফটওয়্যার এর টেকনিক্যাল বিষয় জানেন না। হোয়াইট বক্সে তার উল্টো আর গ্রে বক্সে মাঝামাঝি। উপরের চিত্র দেখলেই বোঝা যাবে।

এবার দেখি কয় ধরনের টেস্টিং আছে

০১. ইউনিট টেস্টিং

০২. ইন্টিগ্রেশন টেস্টিং

০৩. সিস্টেম টেস্টিং

০৪. এক্সেপ্টেন্স টেস্টিং

একটা সফটওয়্যার কোড এর ইউনিট হলো ফাংশন বা মেথড। এই ইউনিটকে টেস্ট করার সিস্টেমই হলো ইউনিট টেস্টিং।

কতগুলা ফাংশনাল ইউনিট এক সাথে একে অপরের সাথে ইন্টারেকশন করার সময় কেমন কাজ করে সেটা টেস্ট করার পদ্ধতি হলো ইন্টিগ্রেশন টেস্টিং।

কতগুলা ফাংশনাল ইউনিট এক সাথে মিলে হয় সফটওয়্যার বা টোটাল সিস্টেম। এই টোটাল সিস্টেম কে টেস্ট করার পদ্ধতি হলো সিস্টেম টেস্টিং

আর সর্বশেষ সম্পুর্ন সিস্টেমটি ইউজারের কতটুকু চাহিদা পূরণ করতে পারবে সেই টেস্ট করাই হলো এক্সেপ্টেন্স টেস্ট বা ইউজার এক্সেপ্টেন্স টেস্ট।

যাক এবার তাহলে আমরা বুঝতে পারলামঃ টেস্টিং কি, কিভাবে কাজ করে, কখন ব্যবহার করতে হবে, কয় ধরনের ইত্যাদি সব। এবার আমরা প্র্যাকটিকাল এ যাবো।

প্রথমেই আমরা দেখবো ইউনিট টেস্টিং। গো এর স্ট্যান্ডার্ড testing লাইব্রেরি খুবই রোবাস্ট, আমরা সেটাই ব্যবহার করবো।

ও হ্যাঁ, TDD নিয়ে কথা বলতে ভুলে গিয়েছিলাম। টেস্ট ড্রিভেন ডেভলপমেন্ট কি এটা নিচের এই ফ্লোচার্ট থেকেই বুঝতে পারবো

সফটওয়্যার কোডিং করার আগে সেটার জন্য টেস্ট লিখবেন, এরপর টেস্ট রান করবেন, টেস্ট পাস না করা পর্যন্ত সফটওয়্যার কোড লিখবেন ও মডিফাই করবেন। এভাবে করে ডেভলপমেন্ট আগাতে থাকবে। কিন্ত সফটওয়্যার কোড করার আগেই সেটাকে টেস্ট করে কিভাবে? আসুন কোডিং এ যাই।

সিনারিওঃ আমরা এমন একটি সফটওয়্যার বানাতে চাচ্ছি যেটা সাধারণ ক্যালকুলেটরের মতো কাজ করবে। যার মাঝে যোগ, বিয়োগ, গুণ ও ভাগের ফাংশন থাকবে। প্রথমে যোগের ফাংশন দিয়েই শুরু করি।

স্টেপ ১ — টেস্ট লিখুন

calculator.go এবং calculator_test.go নামে দুটি ফাইল বানাই। সাধারণত গো এর টেস্ট ফাইলগুলির নামের শেষে <filename_where_test_will_run>_test.go থাকে, এতে করে গো সহজেই টেস্ট ফাইল খুঁজে নিয়ে টেস্ট রান করতে পারে। আর filename_where_test_will_run হলো যে ফাইলে থাকা ফাংশনগুলিকে আমরা টেস্ট করবো সেটা, এখানে calculator.go ফাইলের ফাংশনগুলি আমরা টেস্ট করবো তাই এর টেস্ট ফাইলের নামও এটার অনুসার হয়েছে।

আমরা এখানে টেস্ট ও মূল কোডকে একই প্যাকেজে রেখেছি সুবিধার জন্যে। এরপর আমরা testing প্যাকেজকে ইম্পোর্ট করেছি। এরপর আমরা TestAdd নামে একটি ফাংশন বানিয়েছি যেটা AddFunc নামে একটা ফাংশনকে টেস্ট করবে। AddFunc(1,2) এখানে আমরা আশা করছি এই ফাংশনটি সংখ্যা নিয়ে যোগ করে রেজাল্ট দিবে 3, যদি না দেয় তাহলে টেস্ট ফেইল হবে। আর নয়তো পাস হবে।

এখানে খেয়াল রাখতে হবে প্রতিটা টেস্ট ফাংশনের নাম শুরু হবে Test দিয়ে, এতে করে গো এর টেস্ট কমান্ড খুব সহজেই টেস্টকেস গুলি খুঁজে বের করবে।

স্টেপ ২ — টেস্ট রান করুন

এবার আমরা টেস্ট রান করবো। ঐ ফোল্ডারে থাকা অবস্থায় আমরা নিচের এই কমান্ডটি দেই

go test

দেখুন আমাদের টেস্ট ফেইল করেছে। ভালোভাবে লক্ষ করলেই দেখবেন কেন ফেইল করেছেঃ

./calculator_test.go:6:15: undefined: AddFunc

এখানে দেখাচ্ছে AddFunc নামক ফাংশনটি আন্ডিফাইন্ড। এটাই হবার কথা, কারণ আমরা তো এই ফাংশন বানাইনি। এখন আমাদের কাজ হলো যতক্ষণ পর্যন্ত টেস্ট পাস না হয় ততক্ষণ পর্যন্ত কোড মডিফাই করতে থাকবো আর টেস্ট রান করতে থাকবো।

স্টেপ ৩ — কোড মডিফাই করা

এবার আমরা calculator.go ফাইলে আমাদের AddFunc ফাংশনটি বানালাম। খুবই সিম্পল, আনলিমিটেড (ভেরিয়েবল নাম্বার) আর্গুমেন্ট ইনপুট নিয়ে সেগুলি সব যোগ করে আউটপুট রিটার্ন করবে। খেয়াল করে দেখুন আমাদের ফাংশন শুধুমাত্র রেজাল্টই রিটার্ন করে না, সাথে সাথে এরর থাকলে সেগুলিকেও রিটার্ন করে যা আমরা পরে কাজে লাগাবো। আপাতত আমরা এররকে স্কিপ করে যাবো।

আবার আমরা স্টেপ ২ এ চলে চাই এবং পুনরায় টেস্ট রান করে দেখি

এবার দেখুন আমাদের টেস্ট পাস করেছে। এবার আমরা পরের ফাংশনালিটির দিকে আগাতে পারি। তার আগে আমি আপনাকে আরেকটা জিনিস দেখাতে চাই।

আমরা যে টেস্টটা করলাম এটাকে বলা হয় পজিটিভ টেস্ট বা সঠিক জিনিস এর টেস্ট করা। আমাদেরকে শুধু পজিটিভ টেস্ট করলেই হবে না। আমাদেরকে দেখতে হবে আমাদের ফাংশনে ভুল ইনপুট দিলে বা কোনো ইনপুট না দিলে সবকিছু ঠিক মতো আসে কিনা। এর জন্য আমরা দুটি নেগেটিভ টেস্ট লিখবোঃ

আমরা চেক করেছি 1 + 2 = 4 আসে কিনা, যদি আসে তাহলে আমাদের ফাংশনে ভুল আছে। এরপর আমরা ফাংশনে খালি ইনপুট দিয়ে দেখেছি কোন এরর আসে কিনা, এরর না আসলে আমাদের ফাংশনে ভুল আছে।

টেস্ট রান করে দেখিঃ

টেস্ট পাস করেছে। আর যদি না পাস করতো তাহলে আমরা আমাদের কোড মডিফাই করেই যেতাম যেন পাস করে। খেয়াল করে দেখুন টেস্ট কিন্ত আপনাদের ডেলপমেন্টকে ড্রাইভ করছে। এর ফলে আপনি প্রায় শতভাগ শিওর থাকতে পারেন যে আপনার সফটওয়্যারটি বাগমুক্ত হবে।

গো তে টেস্টকেস লিখা ও টেস্টিং করা খুবই মজার ও সহজ। কয়েকদিন প্র্যাকটিস করলে আপনার কাছে ভালো লাগবে আশা করি।

তো, আপনি বুঝে গেলেন কিভাবে করে গো তে টেস্ট লিখতে হয় এবং টেস্ট ড্রিভেন ডেভলপমেন্ট মেথডলজি ব্যবহার করে ডেভলপমেন্ট করতে হয়। আশা করি কাজে লাগবে। ধন্যবাদ।

--

--

Cyan Tarek
প্রোগ্রামিং পাতা

Software Engineer, Backend Ninja, DevOps Player, Microservice learner, Gopher/Golang Lover