টেস্ট কেস লেখা সময় সবচেয়ে গুরুত্বপূর্ণ বিষয় হল তা পাঠযোগ্য এবং বোঝার সহজ হওয়া। এটি শুধু যে ডেভেলপারদের সাহায্য করবে তা নয়, বরং অন্য কেউ যখন টেস্টগুলো দেখবেন, তারা যেন সহজে বুঝতে পারে কীভাবে কোড আচরণ করছে। RSpec বা যেকোনো টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করার সময় Clean এবং Readable Test Cases লেখা কোডের রক্ষণাবেক্ষণ এবং ডিবাগিং এর জন্য অত্যন্ত গুরুত্বপূর্ণ।
এখানে কিছু উত্তম পদ্ধতি দেওয়া হল যা আপনি RSpec বা অন্য কোনো টেস্ট ফ্রেমওয়ার্কে অনুসরণ করতে পারেন:
১. অর্থপূর্ণ নামকরণ (Descriptive Naming)
টেস্টের নাম (যেমন it ব্লকে) এমন হওয়া উচিত যা পরিষ্কারভাবে বলে দেয় টেস্টটি কী পরীক্ষা করছে। নাম যদি সংক্ষিপ্ত এবং পরিষ্কার হয়, তবে টেস্টের উদ্দেশ্য সহজেই বোঝা যায়।
উদাহরণ:
it "should return true if the user is an adult" do
# test code here
endএটি স্পষ্টভাবে বলে দেয় যে টেস্টটি "যদি ব্যবহারকারী প্রাপ্তবয়স্ক হয় তবে সত্য রিটার্ন করবে"।
অকার্যকর নামকরণ:
it "returns a boolean" do
# test code here
endএই নামকরণ থেকে টেস্টের উদ্দেশ্য বোঝা কঠিন।
২. Arrange, Act, Assert প্যাটার্ন অনুসরণ করুন
টেস্ট কেসগুলোকে তিনটি মূল অংশে ভাগ করা যেতে পারে: Arrange, Act, এবং Assert। এই প্যাটার্নটি আপনার টেস্ট কেসগুলোকে পরিষ্কার এবং সুসংগঠিত রাখে।
- Arrange: টেস্টের জন্য প্রয়োজনীয় ডেটা বা অবস্থা সেটআপ করুন।
- Act: ফিচার বা ফাংশনটিকে কল করুন যেটি আপনি পরীক্ষা করতে চান।
- Assert: ফলাফল যাচাই করুন।
উদাহরণ:
it "calculates the total price correctly" do
# Arrange: Setup test data
cart = Cart.new
cart.add_item(item1)
cart.add_item(item2)
# Act: Call the method to test
total = cart.calculate_total
# Assert: Check the expected result
expect(total).to eq(30) # assuming item1 and item2 have a total price of 30
endএই প্যাটার্ন অনুসরণ করলে, টেস্ট কেসগুলো আরও সুসংগঠিত এবং সহজে বুঝতে সাহায্য করবে।
৩. let এবং before ব্যবহার করে পুনরাবৃত্তি কমান
যখন একই ডেটা বা সেটআপ একাধিক টেস্টে ব্যবহৃত হয়, তখন let বা before ব্লক ব্যবহার করতে পারেন। এটি কোড পুনরাবৃত্তি কমাতে সহায়তা করে এবং টেস্টগুলোকে আরও পরিষ্কার এবং ছোট রাখে।
উদাহরণ:
describe Cart do
let(:item1) { Item.new("Apple", 10) }
let(:item2) { Item.new("Banana", 20) }
let(:cart) { Cart.new }
before do
cart.add_item(item1)
cart.add_item(item2)
end
it "calculates the total price correctly" do
expect(cart.calculate_total).to eq(30)
end
endএখানে let এবং before ব্যবহৃত হচ্ছে যাতে একই item1, item2, এবং cart সেটআপ পুনরায় ব্যবহার করা যায়।
৪. আধিক টেস্ট বা সিঙ্গেল রেসপন্সিবিলিটি (Single Responsibility Principle)
একটি টেস্ট একটিই নির্দিষ্ট ফিচার বা কার্যকারিতা পরীক্ষা করবে, এবং তার কাজও পরিষ্কারভাবে একটি নির্দিষ্ট আউটপুট যাচাই করা। একাধিক ফিচার একসাথে টেস্ট করা এড়িয়ে চলুন, যাতে টেস্টের ফলাফল বুঝতে সমস্যা না হয়।
উদাহরণ:
it "adds items to the cart" do
cart.add_item(item)
expect(cart.items.count).to eq(1)
end
it "calculates the total price correctly" do
cart.add_item(item)
expect(cart.calculate_total).to eq(10)
endএইভাবে, প্রতিটি টেস্ট এক একটি ফিচার পরীক্ষা করছে এবং তার দায়িত্ব স্পষ্ট।
৫. Error Messages এবং Custom Error Descriptions ব্যবহার করুন
যতটা সম্ভব কাস্টম ইরর মেসেজ ব্যবহার করুন যাতে যদি টেস্ট ফেল হয়, তা সঠিকভাবে কী সমস্যা হয়েছে তা বুঝতে সাহায্য করে। এর ফলে ডিবাগিং সহজ হয়।
উদাহরণ:
it "calculates the total price correctly" do
cart.add_item(item)
expect(cart.calculate_total).to eq(10), "Expected the total price to be 10 after adding the item"
endএই কাস্টম মেসেজ টেস্ট ফলস্বরূপ আউটপুটে যুক্ত হয়ে সমস্যার বিশদ ব্যাখ্যা প্রদান করবে।
৬. Context বা Describe ব্লক ব্যবহার করুন
একই ধরনের টেস্টগুলোর জন্য context বা describe ব্লক ব্যবহার করুন, যাতে টেস্টের আচরণ আরও পরিষ্কার হয় এবং তার কার্যকারিতা বুঝতে সহজ হয়।
উদাহরণ:
describe Cart do
context "when adding items" do
it "should increase the item count" do
cart.add_item(item)
expect(cart.items.count).to eq(1)
end
end
context "when calculating total price" do
it "should return the correct total" do
cart.add_item(item)
expect(cart.calculate_total).to eq(10)
end
end
endএখানে context ব্লকটি টেস্টের কার্যকারিতা অনুযায়ী একটি আলাদা পরিবেশ তৈরি করে, যা টেস্টের উদ্দেশ্যকে স্পষ্ট করে।
৭. নির্ভরতা কমান (Minimize Dependencies)
টেস্ট কেসগুলোকে যতটা সম্ভব স্বাধীন রাখুন। এক টেস্টের ফলাফল অন্য টেস্টের উপর নির্ভর না করার চেষ্টা করুন। এর ফলে আপনি এক টেস্টের ব্যর্থতা থেকে অন্য টেস্টে প্রভাবিত হবেন না।
উদাহরণ:
describe User do
it "creates a valid user" do
user = User.new(name: "John")
expect(user).to be_valid
end
it "validates presence of name" do
user = User.new(name: nil)
expect(user).not_to be_valid
end
endএখানে প্রতিটি টেস্ট স্বাধীনভাবে কাজ করছে এবং এক টেস্টের ফলাফল অন্য টেস্টের উপর প্রভাব ফেলছে না।
সারাংশ
Clean এবং Readable Test Cases লেখার জন্য কিছু গুরুত্বপূর্ণ পদ্ধতি হলো:
- অর্থপূর্ণ নামকরণ - টেস্টের উদ্দেশ্য পরিষ্কারভাবে উল্লেখ করুন।
- Arrange, Act, Assert প্যাটার্ন - টেস্টের তিনটি মূল অংশে ভাগ করুন।
letএবংbeforeব্যবহার - কোড পুনরাবৃত্তি কমাতে।- সিঙ্গেল রেসপন্সিবিলিটি - প্রতিটি টেস্টে একটিই ফিচার পরীক্ষা করুন।
- কাস্টম Error Messages - টেস্ট ফেল হলে সাহায্যকারী বার্তা দিন।
- Context বা Describe ব্লক - টেস্টের কার্যকারিতা স্পষ্ট করুন।
- নির্ভরতা কমান - টেস্ট কেসগুলোকে স্বাধীন রাখুন।
এই পদ্ধতিগুলো অনুসরণ করলে আপনার টেস্ট কেসগুলো আরও পরিষ্কার, পাঠযোগ্য এবং রক্ষণাবেক্ষণযোগ্য হবে।
Read more