RSpec-এ Matchers হল সেই বিশেষ ফিচার যা ব্যবহারকারীদের টেস্ট করার জন্য উপযুক্ত উপায় প্রদান করে। এগুলি ব্যবহার করে আমরা কোডের আউটপুট এবং আচরণ যাচাই করতে পারি। Matchers RSpec-এ expect অথবা should (আগে ব্যবহৃত) এর সাথে ব্যবহৃত হয় এবং তারা আমাদের কোডের ফলাফল পরীক্ষা করার জন্য বিভিন্ন ধরনের তুলনা বা যাচাই করতে সাহায্য করে।
Matchers এর ধরন
RSpec-এ বিভিন্ন ধরনের ম্যাচার ব্যবহার করা হয়, যা কোডের বিভিন্ন পরিস্থিতি যাচাই করতে সহায়ক। নিচে কিছু গুরুত্বপূর্ণ ম্যাচারের ব্যাখ্যা দেওয়া হলো:
১. eq Matcher (সমান)
এটি যাচাই করে যে দুটি মান সমান কিনা।
it "দুটি মান সমান কিনা" do
expect(5 + 5).to eq(10)
endএখানে, expect(5 + 5).to eq(10) যাচাই করবে যে ৫ এবং ৫ যোগফল ১০ এর সমান কিনা।
২. be Matcher (সত্য)
এটি যাচাই করে যে একটি মান সত্য (true) কিনা।
it "মানটি সত্য কিনা" do
expect(true).to be true
endএখানে, expect(true).to be true যাচাই করবে যে মানটি সত্য কিনা।
৩. be_nil Matcher (নাল)
এটি যাচাই করে যে মানটি নাল (nil) কিনা।
it "মানটি নাল কিনা" do
expect(nil).to be_nil
endএখানে, expect(nil).to be_nil যাচাই করবে যে মানটি নাল (null) কিনা।
৪. include Matcher (অংশ)
এটি যাচাই করে যে একটি উপাদান অন্য একটি আয়তনে বা তালিকায় অন্তর্ভুক্ত আছে কিনা।
it "তালিকায় উপাদানটি অন্তর্ভুক্ত আছে কিনা" do
expect([1, 2, 3]).to include(2)
endএখানে, expect([1, 2, 3]).to include(2) যাচাই করবে যে সংখ্যা ২ তালিকায় উপস্থিত আছে কিনা।
৫. match Matcher (মিলানো)
এটি একটি স্ট্রিং বা নিয়ম (regex) মিলানোর জন্য ব্যবহৃত হয়।
it "স্ট্রিংটি নিয়মে মিলে কিনা" do
expect("Hello World").to match(/World/)
endএখানে, expect("Hello World").to match(/World/), এটি যাচাই করবে যে স্ট্রিং "Hello World" এ "World" অংশটি আছে কিনা।
৬. raise_error Matcher (এরর তোলা)
এটি যাচাই করে যে একটি নির্দিষ্ট ত্রুটি উঠছে কিনা।
it "একটি ত্রুটি তোলা উচিত" do
expect { raise 'error' }.to raise_error('error')
endএখানে, expect { raise 'error' }.to raise_error('error') যাচাই করবে যে একটি error ত্রুটি তৈরি হচ্ছে কিনা।
৭. change Matcher (পরিবর্তন)
এটি যাচাই করে যে একটি মান বা অবস্থা পরিবর্তিত হয়েছে কিনা।
it "মানটি পরিবর্তিত হবে কিনা" do
x = 1
expect { x = x + 1 }.to change { x }.by(1)
endএখানে, expect { x = x + 1 }.to change { x }.by(1) যাচাই করবে যে x এর মান ১ দ্বারা পরিবর্তিত হচ্ছে কিনা।
৮. satisfy Matcher (সন্তুষ্টি)
এটি একটি কাস্টম শর্ত যাচাই করতে ব্যবহৃত হয়।
it "এটি একটি সঠিক মান কিনা" do
expect(10).to satisfy { |x| x.even? }
endএখানে, expect(10).to satisfy { |x| x.even? } যাচাই করবে যে সংখ্যা ১০ একটি even (যুগ্ম) সংখ্যা কিনা।
সারাংশ
Matchers RSpec-এ একটি অত্যন্ত গুরুত্বপূর্ণ উপাদান যা বিভিন্ন ধরণের পরীক্ষা এবং যাচাই করতে সাহায্য করে। eq, be, include, raise_error, change, এবং match সহ আরও অনেক Matcher রয়েছে যা ডেভেলপারদের কোডের আচরণ এবং আউটপুট পরীক্ষা করতে সাহায্য করে। Matchers ব্যবহার করে আপনি আপনার কোডের প্রত্যাশিত ফলাফল এবং আচরণ যাচাই করতে পারবেন, যা টেস্টিং প্রক্রিয়াকে আরও কার্যকর এবং সুসংহত করে তোলে।
RSpec-এ বিভিন্ন ম্যাচার ব্যবহার করা হয়, যা কোডের আচরণ পরীক্ষা করতে সহায়ক। নিচে কিছু সাধারণ ম্যাচারের ব্যাখ্যা দেওয়া হলো:
১. eq
eq ম্যাচারটি দুইটি মানের সমতা পরীক্ষা করতে ব্যবহৃত হয়। এটি == ব্যবহার করে মানের সমতা চেক করে।
উদাহরণ:
expect(5).to eq(5) # পাস হবে কারণ ৫ সমান ৫
expect(5).to eq(3) # ফেইল হবে কারণ ৫ সমান ৩ নয়২. be_truthy
be_truthy ম্যাচারটি পরীক্ষা করে যে কোনো মান সত্যি (truthy) কি না। রুবিতে, false এবং nil ছাড়া সবকিছুই সত্যি। তাই, এই ম্যাচারটি false বা nil না হলে পাস হবে।
উদাহরণ:
expect(true).to be_truthy # পাস হবে কারণ true সত্যি
expect(1).to be_truthy # পাস হবে কারণ ১ সত্যি
expect(nil).to be_truthy # ফেইল হবে কারণ nil সত্যি নয়৩. be_falsey
be_falsey ম্যাচারটি পরীক্ষা করে যে কোনো মান মিথ্যা (falsey) কি না। রুবিতে, false এবং nil ছাড়া সবকিছুই মিথ্যা নয়। তাই, এই ম্যাচারটি false বা nil হলে পাস হবে।
উদাহরণ:
expect(false).to be_falsey # পাস হবে কারণ false মিথ্যা
expect(nil).to be_falsey # পাস হবে কারণ nil মিথ্যা
expect(true).to be_falsey # ফেইল হবে কারণ true মিথ্যা নয়৪. include
include ম্যাচারটি পরীক্ষা করে যে একটি কোলেকশন (যেমন অ্যারে বা স্ট্রিং) নির্দিষ্ট কোনো মান বা উপাদান অন্তর্ভুক্ত করে কি না।
উদাহরণ (অ্যারে):
expect([1, 2, 3]).to include(2) # পাস হবে কারণ ২ অ্যারেতে অন্তর্ভুক্ত
expect([1, 2, 3]).to include(4) # ফেইল হবে কারণ ৪ অ্যারেতে নেইউদাহরণ (স্ট্রিং):
expect("Hello world").to include("Hello") # পাস হবে কারণ স্ট্রিংটি "Hello" অন্তর্ভুক্ত করে
expect("Hello world").to include("Ruby") # ফেইল হবে কারণ স্ট্রিংটি "Ruby" অন্তর্ভুক্ত করে না৫. match
match ম্যাচারটি একটি স্ট্রিংকে একটি রেগুলার এক্সপ্রেশন (regex) প্যাটার্নের সাথে মিলিয়ে পরীক্ষা করে।
উদাহরণ:
expect("hello").to match(/^h/) # পাস হবে কারণ "hello" শব্দটি 'h' দিয়ে শুরু
expect("hello").to match(/lo$/) # পাস হবে কারণ "hello" শব্দটি 'lo' দিয়ে শেষ
expect("hello").to match(/^a/) # ফেইল হবে কারণ "hello" শব্দটি 'a' দিয়ে শুরু নাসারাংশ
eq: দুইটি মানের সমতা পরীক্ষা করে (==ব্যবহার করে)।be_truthy: মানটি সত্যি কি না পরীক্ষা করে (যেখানেfalseএবংnilবাদে সব কিছু সত্যি)।be_falsey: মানটি মিথ্যা কি না পরীক্ষা করে (falseঅথবাnilমিথ্যা)।include: কোনো কোলেকশনে একটি নির্দিষ্ট মান বা উপাদান অন্তর্ভুক্ত আছে কিনা তা পরীক্ষা করে।match: একটি স্ট্রিং একটি রেগুলার এক্সপ্রেশন প্যাটার্নের সাথে মিলছে কিনা পরীক্ষা করে।
এই ম্যাচারগুলি RSpec-কে আরও শক্তিশালী এবং ব্যবহারযোগ্য করে তোলে, এবং কোডের পরীক্ষা করা সহজ ও পরিষ্কার করে।
RSpec এর Numeric Matchers হল বিশেষ ধরনের ম্যাচার যা সংখ্যার তুলনা করতে ব্যবহৃত হয়। এই ম্যাচারগুলির মাধ্যমে আপনি কোনো সংখ্যা নির্দিষ্ট পরিসরের মধ্যে পড়ছে কিনা বা একটি নির্দিষ্ট মানের চেয়ে বড় বা ছোট কিনা তা যাচাই করতে পারেন। এর মধ্যে be >, be <, এবং be_within বেশ জনপ্রিয় এবং গুরুত্বপূর্ণ।
১. be > Matcher
be > matcher ব্যবহার করে আপনি যাচাই করতে পারেন যে একটি সংখ্যা অন্য সংখ্যার চেয়ে বড় কি না। এটি সাধারণত রেঞ্জ বা সীমার মধ্যে একটি মানের তুলনা করার জন্য ব্যবহৃত হয়।
উদাহরণ:
describe "সংখ্যা যাচাই" do
it "৫ এর চেয়ে বড় হওয়া উচিত" do
expect(10).to be > 5
end
endএখানে, expect(10).to be > 5 যাচাই করছে যে ১০, ৫ এর চেয়ে বড়।
২. be < Matcher
be < matcher ব্যবহার করে আপনি যাচাই করতে পারেন যে একটি সংখ্যা অন্য সংখ্যার চেয়ে ছোট কি না।
উদাহরণ:
describe "সংখ্যা যাচাই" do
it "৫ এর চেয়ে ছোট হওয়া উচিত" do
expect(3).to be < 5
end
endএখানে, expect(3).to be < 5 যাচাই করছে যে ৩, ৫ এর চেয়ে ছোট।
৩. be_within Matcher
be_within matcher ব্যবহার করে আপনি একটি সংখ্যা নির্দিষ্ট মানের মধ্যে পড়ছে কিনা তা পরীক্ষা করতে পারেন। এটি দুইটি মানের মধ্যে তুলনা করতে সহায়ক। এটি সাধারণত দশমিক বা ফ্লোট পয়েন্টের তুলনায় ব্যবহৃত হয় যেখানে একটি ক্ষুদ্র মার্জিনের অনুমতি দেওয়া হয়।
উদাহরণ:
describe "সংখ্যা যাচাই" do
it "১০ এর কাছাকাছি হওয়া উচিত" do
expect(10.5).to be_within(0.5).of(10)
end
endএখানে, expect(10.5).to be_within(0.5).of(10) যাচাই করছে যে ১০.৫, ১০ এর মধ্যে ০.৫ পরিসরের মধ্যে পড়ে কিনা।
সারাংশ
be >: যাচাই করে যে একটি সংখ্যা অন্য সংখ্যার চেয়ে বড়।be <: যাচাই করে যে একটি সংখ্যা অন্য সংখ্যার চেয়ে ছোট।be_within: যাচাই করে যে একটি সংখ্যা একটি নির্দিষ্ট মার্জিনের মধ্যে পড়ে কিনা।
এগুলি RSpec এ বিভিন্ন সংখ্যার তুলনা ও পরীক্ষার জন্য খুবই কার্যকর এবং সাধারণত গণনা, পরিসংখ্যান বা অন্যান্য অঙ্কের কাজগুলির জন্য ব্যবহৃত হয়।
RSpec এ Collection Matchers ব্যবহার করে আপনি বিভিন্ন ধরনের সংগ্রহ (array, hash, etc.) পরীক্ষা করতে পারেন। এই matchers গুলি বিশেষভাবে তখন ব্যবহার করা হয় যখন আপনি একটি সংগ্রহের মধ্যে নির্দিষ্ট মান বা শর্ত যাচাই করতে চান।
১. all Matcher
all matcher ব্যবহার করা হয় যদি আপনি চান যে একটি সংগ্রহের সবটি উপাদান নির্দিষ্ট শর্ত মেনে চলে। অর্থাৎ, একটি আর্গুমেন্টের মধ্যে সমস্ত আইটেমের জন্য যাচাই করা হয়।
উদাহরণ:
describe "all matcher" do
it "সকল উপাদানই ২ এর চেয়ে বড়" do
numbers = [3, 4, 5, 6]
expect(numbers).to all(be > 2) # সবগুলো মান ২ এর বেশি কিনা পরীক্ষা করা হচ্ছে
end
endএখানে, numbers অ্যারের সব উপাদানকে be > 2 শর্তের সাথে মিলিয়ে যাচাই করা হচ্ছে। যদি কোনো উপাদান ২ এর কম হয়, তাহলে টেস্ট ফেল হবে।
২. include Matcher
include matcher ব্যবহার করা হয় যখন আপনি চান যে কোনো সংগ্রহে নির্দিষ্ট মানটি উপস্থিত আছে কিনা তা যাচাই করতে। এটি সাধারণত array, hash বা string এ ব্যবহৃত হয়।
উদাহরণ:
describe "include matcher" do
it "অ্যারে-তে ৩ সংখ্যা থাকা উচিত" do
numbers = [1, 2, 3, 4, 5]
expect(numbers).to include(3) # অ্যারেতে ৩ আছে কিনা পরীক্ষা করা হচ্ছে
end
endএখানে, numbers অ্যারে-এ ৩ উপস্থিত কিনা তা যাচাই করা হচ্ছে। যদি ৩ উপস্থিত থাকে, টেস্ট পাস করবে।
আরও উদাহরণ (String):
describe "include matcher for strings" do
it "স্ট্রিং-এ 'Ruby' শব্দ থাকা উচিত" do
phrase = "I love Ruby programming"
expect(phrase).to include("Ruby")
end
endএখানে, স্ট্রিংয়ে "Ruby" শব্দটি রয়েছে কিনা তা যাচাই করা হচ্ছে।
৩. contain_exactly Matcher
contain_exactly matcher ব্যবহার করা হয় যখন আপনি চান যে একটি সংগ্রহে কিছু নির্দিষ্ট উপাদান সবগুলো উপস্থিত আছে এবং সেগুলি একই পরিমাণে (order এর সঙ্গে কোনো সম্পর্ক না রেখে)। এটি গুরুত্বপূর্ণ যখন সংগ্রহের অর্ডার গুরুত্বপূর্ণ নয়, কিন্তু উপাদানগুলির সংখ্যা এবং মান সঠিক হতে হবে।
উদাহরণ:
describe "contain_exactly matcher" do
it "এখানে ১, ২, ৩, ৪ সমস্ত উপাদান থাকতে হবে" do
numbers = [3, 1, 4, 2]
expect(numbers).to contain_exactly(1, 2, 3, 4) # উপাদানগুলো থাকতে হবে, অর্ডার কোনো ব্যাপার নয়
end
endএখানে, numbers অ্যারে-তে ১, ২, ৩, ৪ মানগুলোর উপস্থিতি যাচাই করা হচ্ছে, তবে অর্ডার (যেমন: [3, 1, 4, 2] এর মধ্যে) কোনো ব্যাপার নয়। যদি এই উপাদানগুলো সঠিকভাবে উপস্থিত থাকে, তাহলে টেস্ট পাস করবে।
আরও উদাহরণ:
describe "contain_exactly with strings" do
it "স্ট্রিংয়ে সব নির্দিষ্ট শব্দ থাকা উচিত" do
words = ["apple", "banana", "cherry"]
expect(words).to contain_exactly("cherry", "banana", "apple")
end
endএখানে, words অ্যারে-এ apple, banana, এবং cherry মানগুলো থাকতে হবে, কিন্তু তাদের অর্ডার গুরুত্বপূর্ণ নয়।
সারাংশ
allmatcher ব্যবহার করা হয় যখন একটি সংগ্রহের সব উপাদানের জন্য একটি শর্ত প্রযোজ্য হতে হবে।includematcher ব্যবহার করা হয় যখন আপনি চান যে একটি সংগ্রহে কোনো নির্দিষ্ট উপাদান উপস্থিত আছে কিনা তা যাচাই করতে।contain_exactlymatcher ব্যবহার করা হয় যখন আপনি চান যে একটি সংগ্রহে নির্দিষ্ট উপাদানগুলো সঠিক পরিমাণে এবং অর্ডার ছাড়া উপস্থিত থাকে।
এগুলো RSpec-এর collection matchers, যা সংগ্রহের বিভিন্ন শর্ত পরীক্ষা করতে সহায়ক।
RSpec এ Custom Matchers তৈরি করার মাধ্যমে আপনি আপনার টেস্টিং প্রক্রিয়াকে আরও সহজ এবং বোধগম্য করতে পারেন। এটি ব্যবহার করে নির্দিষ্ট বৈশিষ্ট্য বা আচরণ যাচাই করার জন্য নতুন ম্যাচার তৈরি করা যায়। Custom Matchers মূলত তখনই ব্যবহৃত হয় যখন বিল্ট-ইন ম্যাচারগুলো আপনার প্রয়োজন মেটাতে সক্ষম হয় না।
Custom Matchers তৈরির ধাপ
১. RSpec::Matchers.define ব্যবহার করে ম্যাচার তৈরি
Custom Matchers তৈরির জন্য RSpec::Matchers.define মেথড ব্যবহার করা হয়। এটি একটি নতুন ম্যাচার সংজ্ঞায়িত করতে সাহায্য করে।
RSpec::Matchers.define :be_multiple_of do |expected|
match do |actual|
actual % expected == 0
end
endউপরের উদাহরণে, আমরা একটি be_multiple_of ম্যাচার তৈরি করেছি যা নির্ধারণ করে যে একটি সংখ্যা অন্য একটি সংখ্যার গুণিতক কিনা।
Custom Matchers এর উপাদানসমূহ
match ব্লক
এটি মূল অংশ যেখানে ম্যাচারের লজিক বা শর্ত লেখা হয়।
match do |actual|
actual % expected == 0
endfailure_message (ঐচ্ছিক)
যদি টেস্ট ব্যর্থ হয়, তবে এটি কাস্টম বার্তা প্রদর্শন করতে ব্যবহৃত হয়।
failure_message do |actual|
"Expected #{actual} to be a multiple of #{expected}"
endfailure_message_when_negated (ঐচ্ছিক)
যখন ম্যাচার নেগেটিভ (e.g., not_to) অবস্থায় ব্যবহার করা হয়, তখন ব্যর্থ বার্তা প্রদর্শন করতে ব্যবহৃত হয়।
failure_message_when_negated do |actual|
"Expected #{actual} not to be a multiple of #{expected}"
enddescription (ঐচ্ছিক)
ম্যাচারটির একটি সংক্ষিপ্ত বিবরণ প্রদান করতে ব্যবহৃত হয়।
description do
"be a multiple of #{expected}"
endএকটি উদাহরণ: গুণিতক যাচাই
কোড
RSpec::Matchers.define :be_multiple_of do |expected|
match do |actual|
actual % expected == 0
end
failure_message do |actual|
"Expected #{actual} to be a multiple of #{expected}, but it was not."
end
failure_message_when_negated do |actual|
"Expected #{actual} not to be a multiple of #{expected}, but it was."
end
endটেস্ট ব্যবহার
describe "Custom Matchers" do
it "যাচাই করে যে সংখ্যা গুণিতক কিনা" do
expect(10).to be_multiple_of(2) # পাস হবে
expect(10).not_to be_multiple_of(3) # পাস হবে
end
endCustom Matchers ব্যবহার: বাস্তব উদাহরণ
১. একটি অ্যারের মধ্যে নির্দিষ্ট উপাদান থাকা যাচাই করা
RSpec::Matchers.define :include_element do |expected|
match do |actual|
actual.include?(expected)
end
end
describe "Array Matcher" do
it "অ্যারের মধ্যে উপাদান আছে কিনা যাচাই করে" do
expect([1, 2, 3]).to include_element(2) # পাস হবে
expect([1, 2, 3]).not_to include_element(5) # পাস হবে
end
end২. একটি স্ট্রিং নির্দিষ্ট ফর্ম্যাট অনুসরণ করছে কিনা
RSpec::Matchers.define :match_format do |regex|
match do |actual|
actual.match?(regex)
end
end
describe "String Matcher" do
it "স্ট্রিং ফর্ম্যাট যাচাই করে" do
expect("hello@example.com").to match_format(/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i) # পাস হবে
expect("invalid-email").not_to match_format(/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i) # পাস হবে
end
endসুবিধা
- সহজবোধ্য টেস্ট: কোড পড়তে ও বোঝতে আরও সহজ।
- পুনরায় ব্যবহারযোগ্যতা: একবার তৈরি করলে Custom Matchers বিভিন্ন টেস্টে পুনরায় ব্যবহার করা যায়।
- নির্দিষ্ট চাহিদা পূরণ: যখন বিল্ট-ইন ম্যাচার যথেষ্ট নয়, তখন এটি প্রয়োজনীয় বৈশিষ্ট্য যোগ করতে সাহায্য করে।
সারাংশ
Custom Matchers RSpec এর একটি শক্তিশালী ফিচার, যা আপনার টেস্টিং অভিজ্ঞতাকে আরও সহজ ও বোধগম্য করে তোলে। RSpec::Matchers.define এবং এর বিভিন্ন উপাদান (যেমন match, failure_message) ব্যবহার করে আপনি আপনার টেস্টিং চাহিদা অনুযায়ী কাস্টমাইজড ম্যাচার তৈরি করতে পারেন। এটি টেস্টিং প্রক্রিয়াকে আরও বিস্তারিত ও কার্যকর করে তোলে।
Read more