TDD পদ্ধতি ও প্রদত্ত টেস্ট স্যুট ব্যবহার করে অনুশীলনী সমাধান করুন
টেস্ট-ড্রিভেন ডেভেলপমেন্ট (যাকে কখনও কখনও টেস্ট-ফার্স্ট ডেভেলপমেন্ট বা টেস্ট-ড্রিভেন ডিজাইনও বলা হয়) হলো এমন একটি চর্চা, যেখানে ইমপ্লিমেন্টেশনের এক লাইন কোড লেখার আগেই ইউনিট টেস্টগুলো লিখে ফেলা হয়।
আপনি যে সব প্র্যাকটিস অনুশীলনীতে কাজ করেন (সেগুলো, যেগুলো আপনাকে নতুন কোনো ধারণা শেখায় না), সেগুলোর সাথে থাকবে কিছু নির্দেশনা, যেখানে সাধারণভাবে বলা থাকে আপনার কী করা দরকার। এই নির্দেশনাগুলোতে ইচ্ছাকৃতভাবেই প্রোগ্রামিং ভাষা-নির্দিষ্ট ইমপ্লিমেন্টেশনের খুঁটিনাটি ধরা থাকে না, কারণ Exercism-এর ৭০টিরও বেশি ভাষার ট্র্যাকের সবগুলোতেই এগুলো একইভাবে ব্যবহৃত হয়। কিছু ভাষার ট্র্যাক আপনার জন্য আরও নির্দিষ্ট খুঁটিনাটি যোগ করে, তবে সব ট্র্যাক তা করে না।
আপনি যখন কোনো প্র্যাকটিস অনুশীলনীতে কাজ শুরু করেন, তখন নির্দেশনাগুলো ভালো করে পড়ে নিন। সেগুলো আপনাকে একটা মোটামুটি ধারণা দেবে যে আপনি কীভাবে একটি সমাধান ইমপ্লিমেন্ট করবেন। তবে সম্পূর্ণ ও সঠিক প্রয়োজনীয়তা বুঝতে হলে আপনাকে টেস্টগুলো পড়তেই হবে:
প্রদত্ত সব টেস্ট যখন রান হয়ে পাস করে, তখন আপনি অনুশীলনীটি সমাধান করেছেন। অন্যভাবে বললে, আপনার সমাধান কেবল নির্দেশনাগুলোর "ঠিক মনে হয়" এমন একটা ব্যাখ্যা নয়, আপনার সমাধান হলো এমন একটি প্রোগ্রাম যা প্রদত্ত টেস্টগুলো পূরণ করে। টেস্টগুলোই অনুশীলনীর সম্পূর্ণ প্রয়োজনীয়তা।
আপনার জন্য ইউনিট টেস্ট স্যুট লেখার কাজটা আমরা করে দিয়েছি। আপনার লক্ষ্য হলো এমন একটি সমাধান লেখা, যাতে ওই সব ইউনিট টেস্ট পাস করানোর জন্য ঠিক যতটুকু দরকার, ততটুকু কোডই থাকে।
এটা মনে রাখবেন: TDD পদ্ধতি আপনাকে সমাধানে পৌঁছাতে সাহায্য করবে, কিন্তু সেখানেই থেমে যাওয়ার দরকার নেই। প্রয়োজনীয়তার বাইরেও যদি আপনি আপনার সমাধান বাড়াতে চান, তবে তা করতে পারেন। টেস্টগুলো পাস হয়ে গেলে আপনি যদি কোনো মেন্টরের সাথে কাজ করার সিদ্ধান্ত নেন (এবং আমরা তা করতেই উৎসাহ দিই), তিনি আপনার প্রাথমিক ইমপ্লিমেন্টেশন রিফ্যাক্টর ও পরিমার্জনে সাহায্য করতে পারেন, এমনকি নতুন ইউনিট টেস্টের প্রস্তাবও দিতে পারেন।
আপনি যখন Exercism-এর ওয়েবসাইটের কোড এডিটরে কাজ করেন, তখন টেস্টগুলো পড়তে পারবেন, কিন্তু সেগুলো এডিট করতে পারবেন না। টেস্ট ফাইলে উল্লেখ থাকা "স্কিপ" ব্যবস্থা যাই থাকুক, আপনি যখনই সেগুলো রান করেন, সব টেস্টই চালানো হবে।
একাধিক টেস্ট ফেল করলে, ওয়েবসাইট শুরুতে কেবল প্রথম ফেলের ফলাফলটাই দেখায়। অন্য ফেলগুলোতেও ক্লিক করে সেগুলো বিস্তারিত দেখতে পারেন! মাঝে মাঝে প্রথম ফলাফলটাই সবচেয়ে বেশি তথ্যবহুল নাও হতে পারে।
অনেক টেস্ট ফেল করলেও মনোবল হারাবেন না। একটা একটা করে সেগুলো পাস করানোর দিকে মনোযোগ দিন।
অনেক ট্র্যাক তাদের টেস্ট ফাইলে "স্কিপ করা" টেস্ট ব্যবহার করে। শুরুতে কেবল প্রথম টেস্টটি "অ্যাকটিভ" থাকে, বাকিগুলো ইনঅ্যাকটিভ (এটা কীভাবে হয় তা ট্র্যাকভেদে ভিন্ন)। আপনার এনভায়রনমেন্টে যখন টেস্ট স্যুট রান করেন, কেবল প্রথম টেস্টটিই চলে। আমরা এটা করি আপনাকে এই ওয়ার্কফ্লো অনুসরণ করতে উৎসাহ দিতে:
সব টেস্ট আনস্কিপ করা পর্যন্ত এই ধাপগুলোRepeat করুন। সব টেস্ট পাস হয়ে গেলে, অভিনন্দন, আপনি অনুশীলনীটি সমাধান করে ফেলেছেন!
টেস্টগুলো ঠিক কীভাবে "আনস্কিপ" (বা অ্যাকটিভ) করা হয়, তা ট্র্যাকের ওপর নির্ভর করে। কিছু ট্র্যাকে সেটা হতে পারে কোনো অ্যানোটেশন কমেন্ট করা বা সরিয়ে ফেলা। কিছু ট্র্যাকে সেটা হতে পারে কোনো অ্যাট্রিবিউট ট্রু থেকে ফলসে বদলে দেওয়া। সময় নিয়ে আপনার ট্র্যাকের ডকুমেন্টেশনটি পড়ুন; এসব খুঁটিনাটি সেখানেই ব্যাখ্যা করা আছে।
যেসব ট্র্যাকে টেস্ট স্কিপ করা হয় না, সেখানে এই ওয়ার্কফ্লো প্রয়োগ করা মানে কেবল টেস্টগুলো কমেন্ট করে এক এক করে আনকমেন্ট করে দেওয়াই যথেষ্ট হতে পারে।
যদিও এটি "উল্টো পথে হাঁটার" মতো মনে হতে পারে, তবুও ইমপ্লিমেন্টেশনের কোড লেখার আগে ইউনিট টেস্ট লিখতে চাওয়ার পেছনে বেশ কিছু ভালো কারণ আছে।
ডিজাইন। এটি আপনাকে সোজা কোড কীভাবে ইমপ্লিমেন্ট করবেন সেখানে ঝাঁপ দেওয়ার বদলে, প্রথমে আপনার প্রোগ্রামের ইন্টারফেস (অর্থাৎ এটি কীভাবে তার কার্যকারিতা বিশ্বের কাছে তুলে ধরে) নিয়ে ভাবতে বাধ্য করে। সুন্দরভাবে ডিজাইন করা (এবং টেস্টযোগ্য!) একটি ইন্টারফেস থাকা অনেক সময় কার্যকর একটি ইমপ্লিমেন্টেশন থাকার চেয়েও বেশি গুরুত্বপূর্ণ।
শৃঙ্খলা। টেস্ট লেখাকে অনেক সময় বিরক্তিকর কাজ বা পরে করার মতো কিছু ভাবা হয়; টেস্টগুলো আগে লিখলে নিশ্চিত হওয়া যায় যে দিনের শেষে আপনার কোডের বেশিরভাগ বা সব কার্যকারিতা ঢেকে দেওয়ার মতো যথেষ্ট ইউনিট টেস্ট আপনি লিখে ফেলেছেন (হয়তো যা কখনও লেখার সুযোগই পেতেন না)।
কম পরিশ্রম। আপনি যদি একটা নিবিড় চক্র মেনে চলেন (একটি টেস্ট লিখুন, তারপর সেই টেস্ট পূরণের কোড লিখুন, তারপর পরের টেস্টটি লিখুন), তাহলে আপনার কোড স্বাভাবিকভাবেই বেড়ে ওঠে। এতে প্রায়ই (সব সময় না হলেও) কম পরিশ্রম নষ্ট হয়; শেষে আপনার প্রয়োজনীয় সব কোডই লেখা হয়ে যায়, আর অপ্রয়োজনীয় কোনো কোড লেখা হয় না।