RSpec এ Mocks এবং Stubs হলো দুটি গুরুত্বপূর্ণ টেস্টিং কৌশল যা বাহ্যিক নির্ভরশীলতা এবং অবজেক্টের আচরণকে অনুকরণ (simulate) করে। এই কৌশলগুলো ইউনিট টেস্টিংএ ব্যবহৃত হয় যাতে আপনি নির্দিষ্ট আচরণ পরীক্ষা করতে পারেন, যা প্রকৃতভাবে কার্যকর করার প্রয়োজন নেই বা যা পরবর্তীতে অন্য কোনো নির্ভরশীল সিস্টেমের উপর নির্ভর করে।
১. Mocks (মকস)
Mocks হলো অবজেক্ট বা মেথডের একটি কৃত্রিম বা মডিফাইড সংস্করণ যা মূল অবজেক্টের আচরণ অনুকরণ (simulate) করে। Mocks ব্যবহৃত হয় যখন আপনি অন্য কোনো অবজেক্টের আচরণ পরীক্ষা করতে চান। এটি মূলত টেস্টের জন্য পূর্বনির্ধারিত প্রত্যাশা সেট করে দেয়। যদি সেই প্রত্যাশা পূর্ণ না হয়, তাহলে টেস্টটি ব্যর্থ হয়।
Mocks এর প্রধান উদ্দেশ্য:
- পরীক্ষা করা যে কোনো অবজেক্ট বা মেথড কোনো নির্দিষ্ট মেথড কল করেছে কি না বা কোনো নির্দিষ্ট আর্গুমেন্ট দিয়ে কল করেছে কি না।
- অবজেক্টের আন্তঃক্রিয়া বা প্রত্যাশিত আউটপুট যাচাই করা।
Sintax:
# মক অবজেক্ট তৈরি
mock_object = double("Mock Object")
# মক অবজেক্টে একটি মেথড এবং প্রত্যাশিত আউটপুট নির্ধারণ
allow(mock_object).to receive(:some_method).and_return("mocked value")
# পরীক্ষার অংশ
it "এটি মক মেথড কল করে" do
expect(mock_object.some_method).to eq("mocked value")
endউদাহরণ:
describe "একটি ক্যালকুলেটর" do
it "সঠিকভাবে মূল্য গণনা করবে যখন মক অবজেক্ট ব্যবহার করা হবে" do
# মক অবজেক্ট তৈরি
tax_calculator = double("TaxCalculator")
# মক অবজেক্টে প্রত্যাশিত আউটপুট নির্ধারণ
allow(tax_calculator).to receive(:calculate_tax).and_return(50)
expect(tax_calculator.calculate_tax).to eq(50)
end
end২. Stubs (স্টাবস)
Stubs হলো এমন একটি কৌশল যেখানে আপনি কোনো অবজেক্টের একটি মেথডকে ফিক্সড আউটপুট প্রদান করতে নির্দেশ দেন। স্টাবিং মেথডের মাধ্যমে, আপনি প্রত্যাশিত আউটপুট প্রদান করে থাকেন, যা মূলত অন্য কোনো অবজেক্ট বা সিস্টেমের আচরণের পরিবর্তে ব্যবহৃত হয়। এর মূল উদ্দেশ্য হলো পরীক্ষা করা যে একটি মেথড কোনো নির্দিষ্ট আউটপুট প্রদান করছে কিনা।
Stubs এর প্রধান উদ্দেশ্য:
- একটি মেথডকে কৃত্রিম আউটপুট প্রদান করা যাতে বাস্তব অবস্থা বা নির্ভরশীল সিস্টেমের প্রয়োজন না পড়ে।
- কোডের নির্দিষ্ট অংশের ফলাফল পরীক্ষা করা।
Sintax:
# স্টাব মেথড
allow(object).to receive(:method_name).and_return(value)উদাহরণ:
describe "একটি ক্যালকুলেটর" do
it "স্টাব ব্যবহার করে সঠিকভাবে গণনা করবে" do
calc = Calculator.new
# স্টাবিং
allow(calc).to receive(:add).and_return(10)
expect(calc.add).to eq(10)
end
endMocks এবং Stubs এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | Mocks | Stubs |
|---|---|---|
| কাজ | অন্য অবজেক্ট বা মেথডের সাথে ইন্টারঅ্যাকশন যাচাই করা | মেথডের ফলাফল সরবরাহ করা, অন্য কোনো অবজেক্টের ইন্টারঅ্যাকশন না করেই |
| ব্যবহার | মেথডের কল, আর্গুমেন্ট বা আচরণ যাচাই করা | মেথডের আউটপুট কাস্টমাইজ করা |
| আউটপুট | প্রত্যাশিত আউটপুট যদি মেথড কল করা হয় তবে টেস্ট পাস হয় | কাস্টম আউটপুট সরবরাহ করে |
| ফোকাস | মেথড কলের সাথে সম্পর্কিত (কোনো নির্দিষ্ট কল বা আচরণ) | মেথডের আউটপুট বা ফলাফলের উপর ফোকাস |
সারাংশ
- Mocks সাধারণত কোনো অবজেক্ট বা মেথডের কল যাচাই করতে ব্যবহৃত হয়, যেমন এটি নির্দিষ্ট আর্গুমেন্ট ব্যবহার করছে কিনা বা ঠিক মতো কল হচ্ছে কিনা।
- Stubs কোনো নির্দিষ্ট মেথডের আউটপুট কাস্টমাইজ করতে ব্যবহৃত হয়, যাতে বাহ্যিক নির্ভরশীলতা বা অন্যান্য সিস্টেমের প্রয়োজন না হয়।
মকস এবং স্টাবস, দুইই টেস্টিংয়ের একটি গুরুত্বপূর্ণ অংশ, যা কোডের নির্ভরশীলতা নিয়ন্ত্রণ করে এবং নির্দিষ্ট আচরণ বা ফলাফল পরীক্ষা করতে সহায়ক।
Mocks এবং Stubs হল বাহ্যিক নির্ভরশীলতা বা ফাংশনাল অংশের অনুকরণ (mocking) এর দুটি গুরুত্বপূর্ণ উপাদান যা RSpec এবং অন্যান্য টেস্টিং ফ্রেমওয়ার্কে ব্যবহৃত হয়। এগুলি মূলত ডিপেনডেন্সি ইনজেকশন ও ইউনিট টেস্টিং এর ক্ষেত্রে সাহায্য করে, যেখানে বাহ্যিক সিস্টেম (যেমন ডাটাবেস, API কল, বা ফাইল সিস্টেম) সরাসরি টেস্টের অংশ না হয়ে, মক বা স্টাব করা হয়।
তাদের মূল উদ্দেশ্য হল টেস্টিং পরিবেশে নির্দিষ্ট কিছু কন্ডিশন তৈরি করা, যাতে কোডের লজিক সহজে পরীক্ষা করা যায়।
১. Mocks (মক)
Mock হল এমন একটি অবজেক্ট বা ফাংশন যা অনুকরণ করে একটি নির্দিষ্ট বাহ্যিক সিস্টেম বা উপাদানকে। যখন কোন নির্দিষ্ট অবজেক্ট বা মেথডের আচরণ পরীক্ষিত হতে হয়, তখন মক ব্যবহার করা হয়। মক ব্যবহারের সময়, আপনি বিশেষভাবে সেট করেন যে মক করা অবজেক্টটি কিভাবে আচরণ করবে, এবং টেস্ট রান করার সময় এটি সেই আচরণ অনুসরণ করবে।
মৌলিক বৈশিষ্ট্য:
- অভ্যন্তরীণ আচরণ নির্ধারণ করা হয়।
- ফাংশন কলের প্রত্যাশা করা হয়, অর্থাৎ, কেমন কল আসবে এবং কতবার আসবে।
- যদি কোনো কল প্রত্যাশিত না হয়, তবে এটি টেস্টের ব্যর্থতা ঘটায়।
উদাহরণ:
class User
def send_email
# এটি আসল মেইল সিস্টেমকে কল করবে
end
end
describe User do
it "মেইল পাঠানোর জন্য send_email মেথড কল করবে" do
user = double("User") # মক অবজেক্ট তৈরি
allow(user).to receive(:send_email) # মক মেথড
user.send_email
expect(user).to have_received(:send_email) # প্রত্যাশিত কলের জন্য পরীক্ষা
end
endএখানে, send_email মেথডটি double দ্বারা মক করা হয়েছে এবং have_received Matcher দিয়ে যাচাই করা হয়েছে।
২. Stubs (স্টাব)
Stub হলো এমন একটি অবজেক্ট বা মেথড যা কেবলমাত্র নির্দিষ্ট ফলাফল প্রদান করে, কিন্তু কোনো নির্দিষ্ট কার্যক্রম (behaviour) সম্পাদন না করে। স্টাব সাধারণত ফাংশন/মেথডের আউটপুট কন্ট্রোল করতে ব্যবহৃত হয়, যাতে টেস্টের সময় নির্দিষ্ট ফলাফল মক করা যায়। এটি কোডের বাইরে কোনো বাহ্যিক সিস্টেমে (যেমন, ডাটাবেস বা API) কল না করে, একটি নির্দিষ্ট ফলাফল ফেরত দেয়।
মৌলিক বৈশিষ্ট্য:
- ফলাফল বা আউটপুট নির্ধারণ করা হয়, কিন্তু কার্যকলাপের আচরণ নয়।
- বাহ্যিক কল বা প্রক্রিয়া না চালিয়েও, শুধুমাত্র ফলাফল প্রদান করা হয়।
- প্রত্যাশিত আউটপুট প্রদান করা হয়, তবে কোনো কার্যকলাপ বা অবস্থা পরীক্ষা করা হয় না।
উদাহরণ:
class Calculator
def add(a, b)
a + b
end
end
describe Calculator do
it "যোগফল প্রদান করবে" do
calc = double("Calculator")
allow(calc).to receive(:add).with(2, 3).and_return(5) # স্টাব মেথড
result = calc.add(2, 3)
expect(result).to eq(5) # স্টাব ফলাফল যাচাই
end
endএখানে, add মেথডটিকে স্টাব করা হয়েছে এবং with ও and_return দ্বারা নির্দিষ্ট আউটপুট প্রদান করা হয়েছে।
Mocks এবং Stubs এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | Mocks | Stubs |
|---|---|---|
| প্রধান লক্ষ্য | কলের প্রত্যাশা পরীক্ষা করা | নির্দিষ্ট আউটপুট প্রদান করা |
| ব্যবহার | আচরণ যাচাই করা (কতবার কল হয়েছে) | নির্দিষ্ট আউটপুট প্রদান করা |
| পরীক্ষা | কলের প্রতিক্রিয়া ও আচরণ পরীক্ষা | শুধুমাত্র আউটপুট পরীক্ষা করা |
| ভুল হলে | যদি কল প্রত্যাশিত না হয়, তাহলে টেস্ট ব্যর্থ হয় | যদি ফলাফল সঠিক না হয়, তাহলে টেস্ট ব্যর্থ হয় |
সারাংশ
Mocks এবং Stubs হল টেস্টিং টুলস যা বাহ্যিক নির্ভরশীলতাগুলিকে মক বা স্টাব করতে সাহায্য করে। Mocks ব্যবহার করা হয় যখন নির্দিষ্ট আচরণ বা কল পরীক্ষা করতে হয় এবং Stubs ব্যবহার করা হয় যখন নির্দিষ্ট আউটপুট প্রদান করতে হয়। এগুলি ডেভেলপারদের তাদের কোডের লজিক পরীক্ষা করতে সাহায্য করে, বাহ্যিক সিস্টেম বা উপাদানগুলোকে টেস্টের বাইরে রেখে।
RSpec-এ Mocks এবং Stubs ব্যবহার করা হয় বাহ্যিক ডিপেন্ডেন্সি বা নির্ভরশীলতাগুলির আচরণ অনুকরণ (mocking) এবং পরিবর্তন (stubbing) করতে। এটি মূলত টেস্ট লেখার সময় বাহ্যিক সিস্টেম বা ক্লাসের ওপর নির্ভরশীলতা দূর করতে সহায়ক, যাতে টেস্টটি নির্দিষ্ট অংশের আচরণ যাচাই করতে পারে।
Mocking: মকিং দ্বারা আমরা একটি অবজেক্টের ফাংশন বা মেথডের আচরণ অনুকরণ করি।
Stubbing: স্টাবিং দ্বারা আমরা একটি মেথডকে নির্দিষ্ট মান প্রদান করি, যাতে সেটি টেস্টের জন্য পূর্বনির্ধারিত ফলাফল প্রদান করে।
RSpec-এ allow এবং expect ব্যবহার করে Mocks এবং Stubs তৈরি করা যায়।
১. allow ব্যবহার করে Stub তৈরি
allow ব্যবহার করে মেথড স্টাব করা হয়। এটি মেথডটি একটি নির্দিষ্ট মান বা আচরণ প্রদান করতে বলে, কিন্তু এটি কখনও আন্তরিকভাবে কার্যকর হয় না।
উদাহরণ: allow দিয়ে Stub করা
ধরা যাক, আমাদের একটি User ক্লাস আছে, যা একটি API কল করে এবং সেটা থেকে তথ্য নিয়ে আসে। কিন্তু এই API কলের আচরণকে আমরা টেস্টে অগ্রাহ্য করতে চাই, যাতে প্রকৃত API কল না হয়ে একটি পূর্বনির্ধারিত মান ফিরিয়ে দেয়।
# user.rb
class User
def fetch_data
# API কল যা আমরা টেস্টে mock বা stub করতে চাই
"Real Data from API"
end
endটেস্ট কোড:
# spec/user_spec.rb
require './user'
describe User do
it "stub করে fetch_data মেথডটি" do
user = User.new
# allow দিয়ে মেথড স্টাব করা
allow(user).to receive(:fetch_data).and_return("Stubbed Data")
# এখন fetch_data মেথডটি 'Stubbed Data' ফেরত দেবে
expect(user.fetch_data).to eq("Stubbed Data")
end
endএখানে:
allow(user).to receive(:fetch_data).and_return("Stubbed Data"):fetch_dataমেথডটিStubbed Dataফেরত দিতে নির্দেশ দেয়, যদিও প্রকৃত API কল ঘটবে না।
২. expect ব্যবহার করে Mock তৈরি
expect ব্যবহার করে মক তৈরি করা হয়। এটি একটি মেথডের ওপর একটি নির্দিষ্ট আচরণ বা কল প্রত্যাশা করে এবং নিশ্চিত করে যে সেটি একাধিকবার কল হয় বা নির্দিষ্ট আর্গুমেন্ট নিয়ে কল হয়।
উদাহরণ: expect দিয়ে Mock করা
ধরা যাক, একটি Logger ক্লাস আছে, যার একটি log_message মেথড আছে, এবং আমরা চাই যে এই মেথডটি একটি নির্দিষ্ট বার্তা লগ করবে।
# logger.rb
class Logger
def log_message(message)
# লোগিং কার্যক্রম
puts message
end
endটেস্ট কোড:
# spec/logger_spec.rb
require './logger'
describe Logger do
it "mock করে log_message মেথডটি" do
logger = Logger.new
# মক করা: আমরা আশা করি যে log_message মেথডটি একটি নির্দিষ্ট আর্গুমেন্ট নিয়ে কল হবে
expect(logger).to receive(:log_message).with("Test message")
# log_message কল করা
logger.log_message("Test message")
end
endএখানে:
expect(logger).to receive(:log_message).with("Test message"): আমরা আশা করি যেlog_messageমেথডটি"Test message"আর্গুমেন্ট সহ কল হবে।- এই টেস্টটি নিশ্চিত করবে যে মেথডটি সঠিকভাবে কল হচ্ছে।
৩. allow এবং expect এর মধ্যে পার্থক্য
allow: মেথডটি একটি নির্দিষ্ট ফলাফল ফিরিয়ে দেবে, কিন্তু এটি কোন পরীক্ষা করবে না বা কোন নির্দিষ্ট আচরণ নিশ্চিত করবে না। এটি স্টাবিংয়ের জন্য ব্যবহৃত হয়।expect: মেথডটি একটি নির্দিষ্ট আচরণ বা কল হওয়ার প্রত্যাশা তৈরি করে এবং এটি নিশ্চিত করবে যে মেথডটি কল হয়েছে বা কল হয়নি।
allow এবং expect ব্যবহার পার্থক্য:
allow: মেথড স্টাব করে নির্দিষ্ট ফলাফল দেয়, কিন্তু এটি কল হওয়ার সংখ্যা বা আর্গুমেন্ট পরীক্ষা করে না।expect: মেথডটি একটি নির্দিষ্ট আর্গুমেন্ট নিয়ে কল হবে বা নির্দিষ্ট সময়ে কল হবে কিনা তা পরীক্ষা করে।
সারাংশ
- Mocks এবং Stubs RSpec-এ বাহ্যিক নির্ভরশীলতা বা সিস্টেম অনুকরণ করতে ব্যবহৃত হয়।
allowস্টাবিংয়ের জন্য ব্যবহার করা হয়, যা একটি মেথডকে পূর্বনির্ধারিত ফলাফল দেয়।expectমকিংয়ের জন্য ব্যবহার করা হয়, যা একটি নির্দিষ্ট আচরণ বা কল করার প্রত্যাশা করে।
এই দুইটি উপাদান RSpec-এ টেস্ট লেখার সময় ডিপেন্ডেন্সি মকিং এবং স্টাবিংয়ের জন্য গুরুত্বপূর্ণ ভূমিকা পালন করে।
RSpec-এর মাধ্যমে আপনি মেথড কল এবং রিটার্ন ভ্যালু manipulate (পরিবর্তন) করতে পারেন। এর জন্য আপনি মকিং (Mocking) এবং স্পাইং (Spying) ব্যবহার করতে পারেন, যা কোনো নির্দিষ্ট মেথড বা তার রিটার্ন ভ্যালু পরীক্ষা করার জন্য খুবই কার্যকরী।
১. মকিং (Mocking)
মকিং এর মাধ্যমে, আপনি বাস্তব মেথডের পরিবর্তে মক অবজেক্ট তৈরি করতে পারেন এবং সেই অবজেক্টের মাধ্যমে মেথড কল করতে পারেন। এটি একধরনের টেস্ট ডাবল।
উদাহরণ:
ধরা যাক, আমাদের একটি Order ক্লাস রয়েছে এবং send_email মেথডটি একটি ইমেইল পাঠানোর কাজ করে।
class Order
def send_email
# এখানে ইমেইল পাঠানোর কোড থাকবে
"ইমেইল পাঠানো হয়েছে"
end
endএখন আমরা যদি মকিং ব্যবহার করতে চাই, তাহলে:
describe Order do
it "ইমেইল পাঠানোর জন্য মকিং ব্যবহার করবে" do
order = double("Order") # মক অবজেক্ট তৈরি
allow(order).to receive(:send_email).and_return("ইমেইল পাঠানো হয়েছে") # মক মেথডের রিটার্ন ভ্যালু
expect(order.send_email).to eq("ইমেইল পাঠানো হয়েছে")
end
endএখানে double("Order") মক অবজেক্ট তৈরি করেছে এবং allow(order).to receive(:send_email).and_return("ইমেইল পাঠানো হয়েছে") মেথড কলের রিটার্ন ভ্যালু কাস্টমাইজ করে দিয়েছে।
২. স্পাইং (Spying)
স্পাইং হলো মকিংয়ের মতোই, তবে এটি মেথডটি আসলেই কল হবে কিনা এবং তার রিটার্ন ভ্যালু কী হবে তা পরীক্ষার জন্য ব্যবহার করা হয়। এতে আপনি মেথডটির সাইড ইফেক্ট দেখতে পারেন।
উদাহরণ:
ধরা যাক, আমাদের আবার Order ক্লাস রয়েছে এবং send_email মেথডটি একটি ইমেইল পাঠানোর কাজ করে।
class Order
def send_email
"ইমেইল পাঠানো হয়েছে"
end
endএখন যদি আপনি একটি স্পাই ব্যবহার করেন:
describe Order do
it "ইমেইল পাঠানোর মেথড কল হয়েছে কিনা তা পরীক্ষা করবে" do
order = Order.new
spy_order = spy("Order", send_email: "ইমেইল পাঠানো হয়েছে") # স্পাই তৈরি
expect(spy_order.send_email).to eq("ইমেইল পাঠানো হয়েছে")
expect(spy_order).to have_received(:send_email) # মেথড কল হয়েছে কিনা তা পরীক্ষা
end
endএখানে, spy মক অবজেক্ট তৈরি করেছে যা send_email মেথড কলের রিটার্ন ভ্যালু স্পেসিফাই করে এবং পরে have_received(:send_email) দিয়ে যাচাই করে যে মেথডটি কল হয়েছে কিনা।
৩. মেথডের রিটার্ন ভ্যালু কাস্টমাইজ করা
RSpec এ আপনি মেথডের রিটার্ন ভ্যালু কাস্টমাইজও করতে পারেন। এর মাধ্যমে আপনি মেথডের কার্যকারিতা বা আউটপুট নিয়ন্ত্রণ করতে পারেন।
উদাহরণ:
ধরা যাক, একটি Discount ক্লাস রয়েছে যা একটি ডিসকাউন্ট রেট দেয়:
class Discount
def rate
10 # ডিসকাউন্ট রেট
end
endএখন আপনি যদি rate মেথডের রিটার্ন ভ্যালু কাস্টমাইজ করতে চান:
describe Discount do
it "ডিসকাউন্ট রেট পরিবর্তন করবে" do
discount = double("Discount")
allow(discount).to receive(:rate).and_return(20) # রিটার্ন ভ্যালু কাস্টমাইজ
expect(discount.rate).to eq(20)
end
endএখানে, allow(discount).to receive(:rate).and_return(20) দিয়ে rate মেথডের রিটার্ন ভ্যালু কাস্টমাইজ করা হয়েছে।
৪. মেথডের রিটার্ন ভ্যালু এবং আর্গুমেন্ট চেক করা
RSpec এ আপনি মেথডের রিটার্ন ভ্যালু এবং আর্গুমেন্টও চেক করতে পারেন, যাতে নিশ্চিত হতে পারেন মেথডটি সঠিকভাবে কাজ করছে।
উদাহরণ:
ধরা যাক, আমাদের একটি Calculator ক্লাস রয়েছে, যা দুটি সংখ্যার যোগফল দেয়:
class Calculator
def add(a, b)
a + b
end
endএখন, যদি আপনি নিশ্চিত হতে চান যে, add মেথডটি সঠিক আর্গুমেন্ট নিয়ে কল হচ্ছে:
describe Calculator do
it "দুটি সংখ্যা যোগফল সঠিকভাবে বের করে" do
calculator = Calculator.new
allow(calculator).to receive(:add).with(2, 3).and_return(5)
expect(calculator.add(2, 3)).to eq(5) # আর্গুমেন্ট চেক
end
endএখানে, with(2, 3) দ্বারা আর্গুমেন্টগুলো চেক করা হচ্ছে এবং and_return(5) দিয়ে রিটার্ন ভ্যালু কাস্টমাইজ করা হয়েছে।
সারাংশ
RSpec এ মেথড কল এবং রিটার্ন ভ্যালু manipulate করার জন্য মকিং এবং স্পাইিং দুটি শক্তিশালী টুল। মকিংয়ের মাধ্যমে আপনি মেথড বা ক্লাসের আচরণ বদলাতে পারেন, এবং স্পাইিংয়ের মাধ্যমে মেথড কলের কার্যকারিতা যাচাই করতে পারেন। এই দুটি পদ্ধতি ব্যবহার করে আপনি আপনার কোডের সঠিকতা যাচাই করার পাশাপাশি তার আচরণ নিয়ন্ত্রণও করতে পারবেন।
Test Doubles হল এমন একটি কৌশল যা সফটওয়্যার টেস্টিংয়ের সময়, বিশেষত ইউনিট টেস্টিং বা ইন্টিগ্রেশন টেস্টিং এ ব্যবহৃত হয়, যেখানে টেস্টিং কোডের নির্ভরশীলতা (dependencies) অথবা বাহ্যিক সিস্টেম (যেমন ডাটাবেস, API, ফাইল সিস্টেম ইত্যাদি) সিমুলেট (অনুকরণ) করা হয়। এই অনুকৃত অবজেক্টগুলোকে Test Doubles বলা হয়, কারণ তারা আসল অবজেক্টের মতোই কাজ করে, কিন্তু শুধুমাত্র টেস্টিং উদ্দেশ্যে ব্যবহৃত হয়।
Test Doubles এর মাধ্যমে, টেস্টিংয়ের সময় বাহ্যিক সিস্টেম বা কোডের নির্ভরশীলতা মক বা স্টাব করা যায়, যা টেস্টকে আরও দ্রুত, নির্ভুল এবং কন্ট্রোলেবল করে তোলে। এতে রিয়েল ডেটা বা প্রকৃত সিস্টেমের যোগাযোগ ছাড়াই শুধুমাত্র সেই অংশটির কার্যকারিতা পরীক্ষা করা সম্ভব হয় যা আপনি টেস্ট করতে চান।
Test Doubles এর ধরনসমূহ
Test Doubles বিভিন্ন ধরনের হতে পারে, যার মধ্যে কিছু সাধারণ ধরনের হলো:
Mocks:
- Mocks হল এমন অবজেক্ট যা নির্দিষ্ট মেথড কল করার জন্য ব্যবহার করা হয় এবং তাদের আচরণ পূর্বনির্ধারিত থাকে। আপনি যখন মক ব্যবহার করেন, তখন আপনি চাচ্ছেন টেস্টের সময় নির্দিষ্ট মেথড কল হয় কি না এবং সেগুলোর আউটপুট কী।
- Mocks এ সাধারণত এক্সপেকটেশন থাকে, অর্থাৎ কোন মেথড কবে এবং কীভাবে কল হবে তা নির্ধারিত থাকে।
উদাহরণ:
class User def send_email # ইমেইল পাঠানোর কোড end end describe User do it "ইমেইল পাঠানোর জন্য send_email কল করবে" do user = double("User") expect(user).to receive(:send_email) user.send_email end endStubs:
- Stubs হল এমন অবজেক্ট যা মেথড কল করার সময় একটি পূর্বনির্ধারিত ফলাফল প্রদান করে। এটি মূলত আউটপুটের জন্য ব্যবহৃত হয়, এবং এই আউটপুটটি আপনার টেস্টের জন্য প্রয়োজনীয় ফলাফল হতে পারে।
- Stubs কোনো এক্সপেকটেশন রাখে না, শুধুমাত্র আউটপুট প্রদান করে।
উদাহরণ:
class Calculator def add(a, b) a + b end end describe Calculator do it "দ্বি-সংখ্যার যোগফল প্রদান করবে" do calculator = double("Calculator") allow(calculator).to receive(:add).and_return(5) expect(calculator.add(2, 3)).to eq(5) end endSpies:
- Spies হল এমন অবজেক্ট যা কোনো নির্দিষ্ট মেথড কল হয়নি বা হওয়া উচিত তা রেকর্ড করে। এটি মক এবং স্টাবের সংমিশ্রণ হতে পারে। Spies এর মাধ্যমে আপনি মেথড কলগুলো ট্র্যাক করতে পারবেন, কিন্তু সেই কলের জন্য পূর্বনির্ধারিত আউটপুট নেই।
উদাহরণ:
class Logger def log(message) # মেসেজ লগ করার কোড end end describe Logger do it "log মেথড কল হবে" do logger = spy("Logger") logger.log("Hello") expect(logger).to have_received(:log).with("Hello") end end- Fakes:
- Fakes হল এমন বাস্তব অবজেক্ট যেগুলো সাধারণত সম্পূর্ণভাবে বাস্তব নয়, কিন্তু তারা সাধারণভাবে ডেভেলপমেন্ট পরিবেশে কাজ করে। Fakes ব্যবহার করে একটি নির্দিষ্ট কাজ সাধিত হয়, তবে তারা প্রকৃত সিস্টেমের মতো কাজ না করতে পারে।
- উদাহরণস্বরূপ, একটি ফেক ডাটাবেস যা কেবল ডেটা সেভ বা রিট্রিভ করার সহজ প্রক্রিয়া অনুকরণ করে।
Test Doubles এর প্রয়োজনীয়তা
- বাহ্যিক নির্ভরশীলতা এবং এক্সটার্নাল সিস্টেমের থেকে মুক্তি: যখন বাহ্যিক সিস্টেম (যেমন API, ডাটাবেস) ব্যবহার করতে পারি না বা সেগুলোর সঙ্গে কাজ করা সম্ভব নয়, তখন Test Doubles ব্যবহৃত হয়।
- টেস্টের গতিশীলতা ও নির্ভুলতা: Test Doubles ব্যবহার করে টেস্টগুলি দ্রুত চালানো যায় কারণ বাহ্যিক সিস্টেমের সাথে যোগাযোগের সময়ের প্রয়োজন হয় না। পাশাপাশি, বাহ্যিক সিস্টেমের পরিবর্তন টেস্টের ফলাফলে প্রভাব ফেলবে না।
- টেস্টের নির্ভুলতা: বাহ্যিক সিস্টেমের পরিবর্তন অথবা গোলমালের কারণে কোডে ভুল প্রভাব না পড়ে সঠিকভাবে নির্দিষ্ট ফিচারের আচরণ পরীক্ষা করা সম্ভব হয়।
- অপর্যাপ্ত ডেটার জন্য: যখন ডেটাবেসে পর্যাপ্ত ডেটা থাকে না অথবা ডেটা আনুপাতিক না হলে, তখন Test Doubles ব্যবহার করে সেই আচরণ পরীক্ষা করা যায়।
- কমপ্লেক্স সিস্টেমে কাজ করার সময়: যদি সিস্টেমে অনেক ইন্টারঅ্যাকশন বা সিস্টেম ডিপেন্ডেন্সি থাকে, তবে সেগুলোর অনুকরণ করে টেস্ট লেখা সহজ হয়।
Test Doubles এর ব্যবহার
- ইউনিট টেস্টিং: Test Doubles ব্যবহার করে নির্দিষ্ট ইউনিটের ফাংশনালিটি পরীক্ষা করা, যেমন মেথড কল বা আউটপুট।
- ইন্টিগ্রেশন টেস্টিং: বহিরাগত সিস্টেমের সাথে যোগাযোগ না করে বিভিন্ন সিস্টেমের মধ্যে যোগাযোগ পরীক্ষা করা।
- রিগ্রেশন টেস্টিং: পূর্ববর্তী ত্রুটি এবং বর্তমান ফিচারের মধ্যে সম্পর্ক পরীক্ষা করা।
সারাংশ
Test Doubles হল সফটওয়্যার টেস্টিংয়ের শক্তিশালী টুল যা বাহ্যিক নির্ভরশীলতা এবং সিস্টেমের সঙ্গে যোগাযোগ ছাড়া নির্দিষ্ট ফিচারের আচরণ পরীক্ষা করতে ব্যবহৃত হয়। Mocks, Stubs, Spies, এবং Fakes এগুলোর প্রধান প্রকার, যা বিভিন্ন পরিস্থিতিতে ব্যবহৃত হয় টেস্টের কার্যকারিতা, গতি এবং নির্ভুলতা উন্নত করতে। Test Doubles ব্যবহারের মাধ্যমে ডেভেলপাররা সহজে নির্ভরশীলতাগুলি মক করে, এক্সটার্নাল সিস্টেমের কোনো প্রভাব ছাড়াই কোডের সঠিকতা নিশ্চিত করতে পারেন।
Read more