RSpec এ Fakes এবং Spies দুটি শক্তিশালী টুল যা টেস্টিং প্রক্রিয়ায় মকিং এবং স্টাবিং এর মাধ্যমে আপনার কোডের নির্ভরশীলতা নিয়ন্ত্রণ করতে সাহায্য করে। এগুলো মূলত টেস্টের সময় আচরণের কাস্টমাইজেশন এবং ট্র্যাকিংয়ের জন্য ব্যবহৃত হয়।
১. RSpec Fakes
Fake হল একটি সরল বিকল্প বা মক অবজেক্ট যা একাধিক উদ্দেশ্যে ব্যবহার করা যায়। এটি সাধারণত পরীক্ষার সময় নির্দিষ্ট ফাংশন বা অবজেক্টের আচরণ পরিবর্তন করার জন্য ব্যবহৃত হয়।
ব্যবহার কৌশল:
Fake সাধারণত কোনো নির্দিষ্ট মেথডকে স্টাব (stub) বা রিপ্লেস (replace) করতে ব্যবহৃত হয়, যাতে আসল মেথডের পরিবর্তে মক ডেটা বা আচরণ ব্যবহার করা যায়।
উদাহরণ:
ধরা যাক, আপনার একটি User ক্লাস আছে, যেখানে একটি send_email মেথড রয়েছে যা ইমেইল পাঠায়। আমরা এখানে ফেইক ব্যবহার করতে পারি, যাতে ইমেইল পাঠানোর প্রকৃত কার্যকলাপ না হয়, কিন্তু মেথডটি সঠিকভাবে কল হচ্ছে কিনা যাচাই করা যায়।
class User
def send_email
# ইমেইল পাঠানোর কোড
end
endটেস্ট কেস:
describe User do
it "ইমেইল পাঠায়" do
user = User.new
fake = double("FakeEmailService") # ফেইক অবজেক্ট তৈরি
allow(user).to receive(:send_email).and_return(true) # send_email ফাংশনটি ফেইক করি
result = user.send_email
expect(result).to be true
end
endএই উদাহরণে, send_email মেথডটি ফেইক করা হয়েছে এবং আমরা নিশ্চিত করেছি যে এটি কল হচ্ছে এবং সঠিক ফলাফল প্রদান করছে।
২. RSpec Spies
Spy একটি ধরনের টুল যা টেস্ট চলাকালীন নির্দিষ্ট মেথড বা কলের আচরণ ট্র্যাক করে। স্পাই সাধারণত ব্যবহৃত হয় এটি পরীক্ষা করতে যে একটি মেথড ঠিকভাবে কল হয়েছে কিনা, তবে এটি মকিং বা স্টাবিংয়ের মতো আচরণ পরিবর্তন করে না।
ব্যবহার কৌশল:
স্পাইয়ের সাহায্যে আপনি শুধু মেথডের কল ট্র্যাক করতে পারেন এবং মেথডটি কতবার, কীভাবে কল হয়েছে তা পরীক্ষা করতে পারেন।
উদাহরণ:
ধরা যাক, User ক্লাসের একটি notify মেথড রয়েছে যা কাউকে নোটিফিকেশন পাঠায়। আমরা এখানে স্পাই ব্যবহার করে যাচাই করব যে এই মেথডটি কতবার কল হয়েছে।
class User
def notify
# নোটিফিকেশন পাঠানোর কোড
end
endটেস্ট কেস:
describe User do
it "নোটিফিকেশন পাঠায়" do
user = User.new
spy = spy("SpyNotificationService") # স্পাই তৈরি করা
allow(user).to receive(:notify).and_call_original # notify মেথড কল করতে দেওয়া
user.notify
expect(user).to have_received(:notify).once # এটি নিশ্চিত করতে হবে যে notify মেথড একবার কল হয়েছে
end
endএই উদাহরণে, notify মেথডটির কল ট্র্যাক করা হয়েছে এবং নিশ্চিত করা হয়েছে যে এটি একবার কল হয়েছে।
Fakes এবং Spies এর মধ্যে পার্থক্য
- Fake:
- এটি একটি মক অবজেক্ট যা আসল কোডের আচরণ কাস্টমাইজ করে এবং টেস্টিং সময় মক ডেটা প্রদান করে।
- এর মাধ্যমে মেথডের বাস্তব কার্যকারিতা পরিবর্তন করা যায় বা কাস্টম আচরণ যোগ করা যায়।
- Spy:
- এটি শুধুমাত্র মেথডের কল ট্র্যাক করে, কিন্তু মেথডের বাস্তব কার্যকারিতা পরিবর্তন করে না।
- স্পাই দিয়ে আপনি পরীক্ষা করতে পারেন যে একটি মেথড ঠিকভাবে কল হয়েছে কিনা এবং কতবার কল হয়েছে।
সারাংশ
RSpec Fakes এবং Spies দুইটি গুরুত্বপূর্ণ টুল যা RSpec টেস্টিং ফ্রেমওয়ার্কে ব্যবহৃত হয়। Fakes মেথড বা অবজেক্টের আচরণ পরিবর্তন করতে সাহায্য করে, এবং Spies মেথডের কল ট্র্যাক করতে ব্যবহৃত হয়। এগুলোর মাধ্যমে আপনি আপনার টেস্ট কোডকে আরও নির্ভরযোগ্য এবং কার্যকরী করতে পারেন।
Fakes এবং Spies হল সফটওয়্যার টেস্টিং এর দুটি গুরুত্বপূর্ণ কৌশল, যেগুলি সাধারণত Mocking এবং Stubbing এর অংশ হিসেবে ব্যবহৃত হয়। এগুলি বিশেষ করে RSpec বা অন্যান্য টেস্টিং ফ্রেমওয়ার্কে ব্যবহৃত হয় যখন টেস্ট করার সময় নির্দিষ্ট ডিপেন্ডেন্সি বা বাহ্যিক সিস্টেমের উপর নির্ভরশীলতা কমাতে হয়। Fakes এবং Spies ডেভেলপারদের টেস্ট পরিবেশে কোডের নির্ভরশীলতাগুলি অনুকরণ (mock) করতে সহায়ক, যাতে মূল সিস্টেমের কার্যকারিতা থেকে বিভ্রান্তি এড়ানো যায়।
Fake কী?
Fake হলো একটি কাস্টম অবজেক্ট বা ক্লাস যা আসল সিস্টেমের আচরণ নকল করে, তবে কিছুটা সাধারণ বা কমপ্লেক্স হতে পারে। Fakes মূলত বাহ্যিক সিস্টেম বা ডিপেন্ডেন্সি (যেমন: ডাটাবেস, API) এর রিপ্লেসমেন্ট হিসেবে কাজ করে। এগুলি আসল সিস্টেমের তুলনায় সাধারণ, তবে কিছুক্ষেত্রে পুরোপুরি কার্যকরী।
Fake এর উদাহরণ:
ধরা যাক, আপনি একটি টেস্টে ডাটাবেসের পরিবর্তে একটি Fake ডাটাবেস ব্যবহার করতে চান। Fake ডাটাবেস আসল ডাটাবেসের মতই কাজ করে, তবে এটি সাধারণভাবে একটি ইন-মেমরি ডাটাবেস হতে পারে যা আসল ডাটাবেসের ডেটা প্রবাহ অনুকরণ করে।
class FakeDatabase
def initialize
@data = []
end
def save(record)
@data << record
end
def find(id)
@data.find { |record| record.id == id }
end
endএখানে FakeDatabase ক্লাসটি আসল ডাটাবেসের একটি সাধারণ প্রতিস্থাপন। এটি ডেটা সংরক্ষণ এবং খোঁজার জন্য একই ধরনের ইন্টারফেস প্রদান করে, তবে আসল ডাটাবেসের মতো কার্যকরী না হওয়া সত্ত্বেও এটি টেস্টের জন্য যথেষ্ট।
Spy কী?
Spy হল এমন একটি টেস্টিং কৌশল যা কোডের মধ্যে কোনো কার্যকলাপ ট্র্যাক করার জন্য ব্যবহৃত হয়। স্পাই সাধারণত method calls অথবা property accesses ট্র্যাক করে, এবং এটি জানিয়ে দেয় যে কোনো মেথড কল হয়েছে কিনা এবং কিভাবে সেটা ঘটেছে। এটি সাধারণত stubbing বা mocking এর সাথে ব্যবহৃত হয়, তবে এর মূল লক্ষ্য হল মেথডের কল বা ডেটার পরিবর্তন রেকর্ড করা।
Spy এর উদাহরণ:
একটি সাধারণ উদাহরণ হিসেবে, যদি আমাদের একটি টেস্টে নিশ্চিত করতে হয় যে একটি মেথড কল হয়েছে, তাহলে Spy ব্যবহার করা যেতে পারে:
class Calculator
def add(a, b)
result = a + b
log(result) # আমরা এখানে log মেথড কল করতে চাই
result
end
def log(value)
puts "Logging: #{value}"
end
end
describe Calculator do
it "logs the result of add" do
calculator = Calculator.new
spy = spy("log") # Spy object
allow(calculator).to receive(:log).and_call_original # Allow the log method to be called
calculator.add(2, 3)
expect(spy).to have_received(:log).with(5) # Checking if the log method was called with 5
end
endএখানে:
spy("log")স্পাই হিসেবে ব্যবহৃত হয়েছে, যাlogমেথডের কল ট্র্যাক করছে।have_received(:log)ব্যবহার করে আমরা নিশ্চিত হচ্ছি যেlogমেথডটি ৫ মানের সঙ্গে কল করা হয়েছে।
Fakes এবং Spies এর মধ্যে পার্থক্য
| Feature | Fake | Spy |
|---|---|---|
| Purpose | আসল সিস্টেমের আচরণ নকল করা (মধ্যবর্তী সিস্টেম) | মেথড কল এবং আর্গুমেন্ট ট্র্যাক করা |
| Usage | ডিপেন্ডেন্সি বা বাহ্যিক সিস্টেম রিপ্লেস করা | একটি মেথড কল হয়েছে কিনা তা যাচাই করা |
| Interaction | কিছু কার্যক্রম সম্পাদন করতে সক্ষম (স্টাব বা ফাংশনাল) | শুধুমাত্র কল ট্র্যাক করা (অ্যাক্সেস করা) |
| Example | Fake ডাটাবেস, Fake সার্ভার | Spy মেথড কল, Spy মেসেজ/লগ |
| Complexity | অধিকাংশ সময় জটিল এবং বাস্তবতায় সম্পূর্ণ সমর্থন প্রদান করে | সাধারণত মেথড কল ট্র্যাকিং এর জন্য সহজ |
সারাংশ
Fakes এবং Spies টেস্টিংয়ে শক্তিশালী টুল যা টেস্টের সময় বাইরের সিস্টেমের উপর নির্ভরশীলতা কমায় এবং শুধুমাত্র সেই কার্যাবলী পরীক্ষা করতে সহায়ক হয় যা আপনাকে প্রয়োজন। Fakes আসল সিস্টেমের আচরণ অনুকরণ করে, যেখানে Spies মেথড কল বা কার্যকলাপ ট্র্যাক করে। Fakes সাধারণত কাস্টম সিস্টেম তৈরিতে ব্যবহার হয়, এবং Spies মেথড কলের ব্যবহার বা আচরণ যাচাই করতে ব্যবহৃত হয়।
RSpec এ spy এবং double হল টেস্টিং-এর অংশ যা বাহ্যিক ডিপেন্ডেন্সি এবং মডিউল বা ক্লাসের আচরণ যাচাই করার জন্য ব্যবহৃত হয়। এগুলি Mocking এবং Stubbing কৌশলের অন্তর্গত এবং বিশেষত Unit Testing এবং Isolation Testing-এ গুরুত্বপূর্ণ ভূমিকা পালন করে।
1. Double
Double হল এমন একটি অবজেক্ট যা কোনও মেথড বা কনস্ট্রাক্টর কলকে সিমুলেট করে। এটি মূলত একটি fake object, যা কোনও নির্দিষ্ট আচরণ বা মেথডের আউটপুট নির্দিষ্টভাবে তৈরি করতে ব্যবহৃত হয়।
Double এর ব্যবহার:
- Stubbing: কোনও মেথড কলের আউটপুট নির্ধারণ করা।
- Behavior Verification: মেথডটি একটি নির্দিষ্ট আচরণ অনুসরণ করছে কিনা তা যাচাই করা।
উদাহরণ:
ধরা যাক, আপনার একটি Order মডেল আছে যা একটি PaymentGateway ক্লাস ব্যবহার করে পেমেন্ট প্রক্রিয়া করতে:
class Order
def initialize(payment_gateway)
@payment_gateway = payment_gateway
end
def process_payment(amount)
@payment_gateway.charge(amount)
end
endএখন, আপনি PaymentGateway ক্লাসের জন্য একটি double ব্যবহার করতে পারেন, যাতে আপনি তার আচরণ পরীক্ষা করতে পারেন, তবে আসল পেমেন্ট গেটওয়ের কার্যকারিতা চালনা করবেন না:
RSpec.describe Order do
it "processes payment correctly" do
# Double তৈরি করা হয়েছে PaymentGateway এর জন্য
payment_gateway_double = double("PaymentGateway")
# PaymentGateway.double এর charge মেথডে স্টাব করা হয়েছে
allow(payment_gateway_double).to receive(:charge).with(100).and_return(true)
order = Order.new(payment_gateway_double)
# Order-এ পেমেন্ট প্রসেস করা হচ্ছে এবং charge মেথডটি পরীক্ষা করা হচ্ছে
expect(order.process_payment(100)).to eq(true)
# charge মেথডটি সত্যি কার্যকর হয়েছে কিনা তা নিশ্চিত করা হচ্ছে
expect(payment_gateway_double).to have_received(:charge).with(100)
end
endএখানে:
- double("PaymentGateway"): এটি একটি fake object তৈরি করেছে যা
PaymentGatewayক্লাসের মত আচরণ করবে। - allow(payment_gateway_double).to receive(:charge): আমরা
chargeমেথডকে স্টাব করেছি, যাতে এটি 100 পেমেন্ট পাওয়ার পরtrueরিটার্ন করে।
2. Spy
Spy হল একটি বিশেষ ধরনের double যা বাস্তবিক মেথড কলগুলির উপর নজর রাখে। এটি method calls বা state পরিবর্তনগুলিকে ট্র্যাক করে, এবং টেস্ট শেষে যাচাই করা যায় মেথডটি ঠিকভাবে কল করা হয়েছে কিনা।
Spy এর ব্যবহার:
- Method Call Verification: এটি মেথড কল হয়েছে কিনা বা কতবার হয়েছে তা যাচাই করতে ব্যবহৃত হয়।
- State Verification: এটি স্টেট পরিবর্তন করেছে কিনা যাচাই করতে ব্যবহৃত হয়।
উদাহরণ:
ধরা যাক, আপনার একটি UserNotifier ক্লাস আছে যা একটি ইমেইল পাঠানোর কাজ করে, এবং আপনি নিশ্চিত করতে চান যে send_email মেথডটি একাধিক বার কল হয়েছে:
class UserNotifier
def send_email(user)
# ইমেইল পাঠানোর লজিক
end
endএখন, আপনি এই মেথডের উপর spy ব্যবহার করতে পারেন:
RSpec.describe UserNotifier do
it "calls send_email once" do
user_notifier = spy("UserNotifier")
# Spy করে send_email মেথডে কল করা
user_notifier.send_email("user@example.com")
# মেথডটি একবার কল হয়েছে কিনা যাচাই
expect(user_notifier).to have_received(:send_email).with("user@example.com")
end
endএখানে:
- spy("UserNotifier"): এটি একটি spy object তৈরি করেছে, যা
UserNotifierক্লাসের আচরণ নকল করে এবং মেথড কলের জন্য নজর রাখে। - have_received(:send_email): এটি যাচাই করবে যে
send_emailমেথডটি সঠিকভাবে কল হয়েছে কিনা এবং কী আর্গুমেন্টের সাথে।
Double এবং Spy এর মধ্যে পার্থক্য
| প্যারামিটার | Double | Spy |
|---|---|---|
| ব্যবহার | কোনও মেথড বা ক্লাসের আচরণ সিমুলেট করে | মেথড কল এবং স্টেট পরিবর্তন ট্র্যাক করে |
| মূল উদ্দেশ্য | মেথডের আউটপুট স্টাব করা এবং একটি fake object তৈরি করা | মেথড কল যাচাই করা এবং রেকর্ড করা |
| মেথড কল ট্র্যাকিং | না, এটি মেথড স্টাবিং-এর জন্য ব্যবহৃত হয় | হ্যাঁ, এটি মেথড কলের সংখ্যা এবং আর্গুমেন্ট ট্র্যাক করে |
| স্টেট ট্র্যাকিং | না | হ্যাঁ, এটি অবজেক্টের স্টেট পরিবর্তনও ট্র্যাক করে |
| তৈরি করা | double("ObjectName") | spy("ObjectName") |
কোথায় Double এবং Spy ব্যবহার করবেন
- Double ব্যবহার করা উচিত যখন:
- আপনি একটি বাহ্যিক ডিপেন্ডেন্সি বা অবজেক্টের আচরণ সিমুলেট করতে চান।
- আপনি মেথডের আউটপুট স্টাব করতে চান, কিন্তু আপনি মেথড কলের উপর নজর রাখতে চান না।
- Spy ব্যবহার করা উচিত যখন:
- আপনি পরীক্ষা করতে চান যে কোনও মেথড কল করা হয়েছে কিনা, কতবার কল করা হয়েছে, এবং কী আর্গুমেন্ট ব্যবহার করা হয়েছে।
- আপনি বাস্তব অবজেক্ট বা মেথডের উপর নজর রাখতে চান, কিন্তু সেই মেথডের আচরণ পরিবর্তন না করে।
সারাংশ
- Double হল একটি ফেক অবজেক্ট যা স্টাবিং এবং ফাংশনালিটি সিমুলেট করতে ব্যবহৃত হয়।
- Spy হল একটি বিশেষ ধরনের ফেক অবজেক্ট যা মেথড কল এবং স্টেট পরিবর্তন ট্র্যাক করে, এবং এটি ব্যবহৃত হয় মেথড কলের পরীক্ষার জন্য।
- উভয়ই Mocking এবং Stubbing কৌশলের অংশ এবং Unit Testing-এ গুরুত্বপূর্ণ ভূমিকা পালন করে।
RSpec-এ Method Call এবং Arguments ট্র্যাক করা একটি গুরুত্বপূর্ণ কাজ, যা বিশেষত মকিং এবং স্পাইং এর মাধ্যমে কোডের আচরণ পরীক্ষা করতে ব্যবহৃত হয়। RSpec-এ মক অবজেক্টের মাধ্যমে আপনি নির্দিষ্ট মেথড কলগুলো এবং সেই কলগুলোর আর্গুমেন্টগুলো ট্র্যাক করতে পারেন। এর মাধ্যমে আপনি নিশ্চিত করতে পারেন যে কোন মেথডটি কবে এবং কিভাবে কল হয়েছে এবং সেই কলের আর্গুমেন্টগুলি সঠিক ছিল কিনা।
১. Method Call Tracking (Method Call ট্র্যাক করা)
RSpec-এ মক অবজেক্ট ব্যবহার করলে আপনি খুব সহজে মেথড কল ট্র্যাক করতে পারেন। এটি এমন একটি অবজেক্ট যা নির্দিষ্ট মেথড কলের আচরণ সিমুলেট করে এবং সেই কলের তথ্য সংগ্রহ করে।
উদাহরণ:
ধরা যাক, আমাদের একটি Calculator ক্লাস আছে, যার মধ্যে একটি add মেথড আছে, যা দুটি সংখ্যার যোগফল দেয়।
class Calculator
def add(a, b)
a + b
end
endএখন, আমরা চাই যে add মেথডটি কখন এবং কিভাবে কল হচ্ছে তা ট্র্যাক করি। আমরা মক অবজেক্ট ব্যবহার করে এটি করতে পারি:
# spec/calculator_spec.rb
require 'rails_helper'
RSpec.describe Calculator, type: :model do
it "tracks method calls" do
calculator = double("Calculator") # Mock object তৈরি
allow(calculator).to receive(:add) # add মেথড মক করা
calculator.add(2, 3) # মেথড কল
expect(calculator).to have_received(:add).with(2, 3) # মেথড কল ট্র্যাক করা
end
endএখানে, আমরা double("Calculator") ব্যবহার করে একটি মক অবজেক্ট তৈরি করেছি এবং তারপর allow(calculator).to receive(:add) ব্যবহার করে add মেথডকে মক করেছি। এরপর, have_received(:add).with(2, 3) দিয়ে চেক করেছি যে, add মেথডটি সত্যিই ২ এবং ৩ আর্গুমেন্ট সহ কল হয়েছে কিনা।
টেস্ট রান:
rspecএই টেস্টটি নিশ্চিত করবে যে add মেথডটি কল করা হয়েছে এবং সঠিক আর্গুমেন্টসহ কল হয়েছে।
২. Arguments Tracking (Arguments ট্র্যাক করা)
have_received ম্যাচার ব্যবহারের মাধ্যমে আপনি মেথড কলের আর্গুমেন্টগুলোও ট্র্যাক করতে পারেন। এটি বিশেষভাবে ব্যবহারী যখন আপনি যাচাই করতে চান যে মেথড কল সঠিক আর্গুমেন্ট সহ হয়েছে কিনা।
উদাহরণ:
ধরা যাক, আমাদের একটি Notifier ক্লাস আছে, যা একটি মেসেজ পাঠায়:
class Notifier
def send_message(user, message)
# কিছু কোড
end
endএখন, আমরা চাই যে send_message মেথডটি সঠিক আর্গুমেন্টের সাথে কল হয়েছে কিনা তা ট্র্যাক করতে।
# spec/notifier_spec.rb
require 'rails_helper'
RSpec.describe Notifier, type: :model do
it "tracks method arguments" do
notifier = double("Notifier")
allow(notifier).to receive(:send_message)
notifier.send_message("John", "Hello, John!") # মেথড কল
expect(notifier).to have_received(:send_message).with("John", "Hello, John!") # আর্গুমেন্ট চেক
end
endএখানে, আমরা মক অবজেক্টে send_message মেথড কলের আর্গুমেন্ট "John" এবং "Hello, John!" যাচাই করছি।
টেস্ট রান:
rspecএই টেস্টটি নিশ্চিত করবে যে send_message মেথডটি সঠিক আর্গুমেন্টের সাথে কল হয়েছে।
৩. Method Call Counting (মেথড কল গোনা)
কখনও কখনও আপনি চান যে একটি নির্দিষ্ট মেথডটি কতবার কল হয়েছে তা গুনে বের করতে। এটি count ম্যাচারের মাধ্যমে করা যায়।
উদাহরণ:
# spec/counter_spec.rb
require 'rails_helper'
RSpec.describe Calculator, type: :model do
it "counts method calls" do
calculator = double("Calculator")
allow(calculator).to receive(:add)
calculator.add(1, 2)
calculator.add(3, 4)
expect(calculator).to have_received(:add).twice # মেথডটি দুইবার কল হয়েছে কিনা চেক করা
end
endএখানে, twice ম্যাচারটি ব্যবহার করা হয়েছে, যা নিশ্চিত করবে যে add মেথডটি দুইবার কল হয়েছে।
৪. স্পাই (Spy) ব্যবহার করা
স্পাই হল এমন একটি উপকরণ যা মূলত একটি মক অবজেক্টের মতো কাজ করে কিন্তু এটি আসল অবজেক্টের আচরণও বাস্তবায়ন করে। স্পাই ব্যবহার করে আপনি মেথড কল এবং আর্গুমেন্ট ট্র্যাক করার পাশাপাশি সেই মেথডের আসল কার্যকরিতা (যেমন মেথডের আউটপুট) দেখতে পারেন।
# spec/calculator_spec.rb
require 'rails_helper'
RSpec.describe Calculator, type: :model do
it "tracks method calls with spy" do
calculator = Calculator.new
spy_calculator = spy("Calculator", add: calculator.add(2, 3)) # স্পাই অবজেক্ট
spy_calculator.add(2, 3)
expect(spy_calculator).to have_received(:add).with(2, 3) # আর্গুমেন্ট যাচাই
end
endএখানে, spy ব্যবহার করা হয়েছে এবং মেথড কল এবং আর্গুমেন্ট ট্র্যাক করা হয়েছে।
সারাংশ
RSpec-এ Method Call এবং Arguments ট্র্যাক করার জন্য মক অবজেক্ট এবং স্পাই ব্যবহার করা হয়। আপনি have_received ম্যাচার দিয়ে মেথড কলের আর্গুমেন্ট এবং ফ্রিকোয়েন্সি ট্র্যাক করতে পারেন। এই ফিচারগুলো টেস্টিংয়ের সময় বিশেষভাবে কার্যকরী, যখন আপনি নিশ্চিত করতে চান যে একটি নির্দিষ্ট মেথড সঠিক আর্গুমেন্টসহ সঠিক সময়ে কল হয়েছে কিনা।
টেস্টিং এর সময়, বিশেষ করে Unit Testing বা Integration Testing এর ক্ষেত্রে, কিছু নির্দিষ্ট পরিস্থিতিতে Fakes এবং Spies ব্যবহৃত হয়। এগুলো সাধারণত মকিং (Mocking) এবং স্টাবিং (Stubbing) এর সমার্থক, কিন্তু কিছু বিশেষ কার্যকারিতা ও ভূমিকা থাকে যা ফেকস এবং স্পাইজকে ইউনিক এবং গুরুত্বপূর্ণ করে তোলে। এগুলোর ব্যবহার টেস্টিং প্রক্রিয়াকে আরও কার্যকর এবং নির্ভুল করে তোলে। নিচে এই টুলগুলোর প্রয়োজনীয়তা ও ব্যবহারের উপকারিতা আলোচনা করা হলো।
১. Fakes (ফেকস)
Fake হল একটি অবজেক্ট বা মডিউল যা মূল অবজেক্ট বা সিস্টেমের সরল প্রতিস্থাপন হিসেবে কাজ করে। ফেকের মধ্যে সাধারণত একটি অল্প ফাংশনালিটি থাকে, কিন্তু এটি আসল সিস্টেমের মতো আচরণ করে এবং কার্যকরভাবে টেস্টে ব্যবহৃত হয়। এটি মূলত নির্দিষ্ট ডিপেন্ডেন্সি বা বাহ্যিক সিস্টেমের জন্য ব্যবহৃত হয় যেগুলো পুরোপুরি পরীক্ষায় অন্তর্ভুক্ত করা সম্ভব নয় বা যা মূল কোডের জন্য অনুপযুক্ত হতে পারে।
ফেকস এর প্রয়োজনীয়তা:
- বাহ্যিক নির্ভরশীলতাগুলির পরিবর্তে ব্যবহার: ফেকস ব্যবহার করা হয় যখন বাহ্যিক সিস্টেম বা ডেটাবেসের সাথে ইন্টারঅ্যাকশন করতে হয়, কিন্তু পুরো সিস্টেমটি পরীক্ষা করা উচিত নয়। উদাহরণস্বরূপ, যদি আপনার অ্যাপ্লিকেশন একটি তৃতীয় পক্ষের API কল করে, তাহলে আপনি সেই API-এর একটি ফেক তৈরি করে সেটা টেস্টে ব্যবহার করতে পারেন।
- কাস্টম অবজেক্ট তৈরি: ফেকস সাধারণত ছোট এবং সহজ অবজেক্ট তৈরি করতে ব্যবহৃত হয়, যা বড় এবং জটিল প্রকল্পের ক্ষেত্রে কার্যকরী।
উদাহরণ:
class FakePaymentGateway
def process_payment(amount)
# ফেক পেমেন্ট প্রসেসিং, এখানে আসল API কল করা হয় না।
true
end
endএখানে, FakePaymentGateway একটি সিম্পল ফেক ক্লাস যা আসল পেমেন্ট গেটওয়ের পরিবর্তে ব্যবহৃত হতে পারে টেস্টে।
২. Spies (স্পাইজ)
Spy হল এমন একটি অবজেক্ট যা টেস্ট চলাকালীন মেথড কল বা ফাংশন কল ট্র্যাক করার জন্য ব্যবহৃত হয়। এটি মূলত কোনও মেথড বা ফাংশনের কল লগ রাখে এবং নিশ্চিত করে যে সেটি সঠিকভাবে ট্রিগার হয়েছে কিনা, অথবা সঠিক আর্গুমেন্টের সাথে কল করা হয়েছে কিনা। স্পাইজ মূলত বাহ্যিক কার্যকলাপ অথবা ফাংশন কলস পর্যবেক্ষণ করতে ব্যবহৃত হয়, যা নিশ্চিত করে যে নির্দিষ্ট মেথড বা অ্যাকশন সঠিকভাবে কার্যকর হয়েছে।
স্পাইজ এর প্রয়োজনীয়তা:
- ফাংশন কল ট্র্যাকিং: স্পাইজ ব্যবহার করা হয় যখন আপনি পরীক্ষা করতে চান যে কোনো ফাংশন বা মেথড সঠিকভাবে কল হয়েছে কিনা। এটি নিশ্চিত করতে সহায়ক যে একটি নির্দিষ্ট ক্রিয়া (যেমন, একটি মেথড কল বা ইভেন্ট ট্রিগার) ঘটেছে বা হয়নি।
- কোডের অবস্থা যাচাই করা: স্পাইজ ব্যবহার করে আপনি নিশ্চিত করতে পারেন যে কোনো নির্দিষ্ট অবজেক্টের উপর কার্যকরী মেথড কল করা হয়েছে।
উদাহরণ:
class User
def notify_admin
AdminNotifier.send_email("admin@example.com")
end
end
describe User do
it "notifies the admin" do
spy = spy('AdminNotifier')
allow(AdminNotifier).to receive(:send_email).and_return(true)
spy.notify_admin
expect(spy).to have_received(:send_email).with("admin@example.com")
end
endএখানে spy দ্বারা আমরা AdminNotifier এর send_email মেথড কল ট্র্যাক করছি এবং নিশ্চিত হচ্ছি যে সঠিক আর্গুমেন্টের সাথে সেটি কল হয়েছে।
৩. Fakes এবং Spies এর মধ্যে পার্থক্য
| ফিচার | Fakes | Spies |
|---|---|---|
| প্রধান উদ্দেশ্য | বাহ্যিক নির্ভরশীলতা বা সিস্টেমের প্রতিস্থাপন করা | মেথড বা ফাংশন কল ট্র্যাক করা |
| ব্যবহার ক্ষেত্র | ডিপেন্ডেন্সি বা বাহ্যিক সিস্টেম (যেমন ডেটাবেস, API) পরীক্ষা করা | মেথড কল এবং কার্যকলাপ নিশ্চিত করা |
| কোডের পরিবর্তন | মূল কোডের কার্যকারিতা সিমুলেট করে | কার্যকলাপ ট্র্যাক করার জন্য কাজ করে |
| কোন ডেটা ফেরত দেয়? | ফেকস সাধারণত নির্দিষ্টভাবে তৈরি ডেটা ফেরত দেয় | স্পাইজ শুধুমাত্র মেথড কল ট্র্যাক করে, ফলাফল নয় |
৪. Fakes এবং Spies এর ব্যবহারিক উদাহরণ
Fake Example:
যেমন একটি ফেক ডেটাবেস:
class FakeDatabase
def find_user_by_email(email)
# ডাটাবেসের মূল কাজের পরিবর্তে এটি একটি সরল ফেক ডেটা ফেরত দেয়।
{ email: email, name: "John Doe" }
end
endএটি মূল ডেটাবেস অবজেক্টের একটি সরল ফেক। মূল ডেটাবেসের কাজটি না করে, এটি কেবল মক ডেটা সরবরাহ করে যা টেস্টের জন্য ব্যবহার করা হয়।
Spy Example:
যেমন একটি স্পাই ব্যবহার করে ফাংশন কল পরীক্ষা:
class EmailSender
def send_welcome_email(user)
# মেইল পাঠানোর লজিক
puts "Sending email to #{user.email}"
end
end
describe EmailSender do
it "calls send_welcome_email with the correct argument" do
spy = spy('EmailSender')
user = double('User', email: 'user@example.com')
spy.send_welcome_email(user)
expect(spy).to have_received(:send_welcome_email).with(user)
end
endএখানে, স্পাই ব্যবহার করে send_welcome_email মেথড কল ট্র্যাক করা হয়েছে, এবং এটি নিশ্চিত করা হয়েছে যে এটি সঠিক আর্গুমেন্টের সাথে কল হয়েছে।
সারাংশ
Fakes এবং Spies টেস্টিং এর জন্য খুবই গুরুত্বপূর্ণ টুল, যা বিশেষভাবে কোডের নির্ভুলতা নিশ্চিত করতে ব্যবহৃত হয়:
- Fakes ব্যবহার করা হয় যখন বাহ্যিক নির্ভরশীলতা বা সিস্টেম (যেমন, ডেটাবেস, API) পরীক্ষা করা হয়।
- Spies ব্যবহার করা হয় মেথড কল পর্যবেক্ষণ করতে, এটি নিশ্চিত করার জন্য যে কোড সঠিকভাবে কার্যকর হচ্ছে।
এই টুলগুলো Unit Testing এবং Integration Testing প্রক্রিয়াকে আরও দক্ষ এবং নির্ভুল করতে সাহায্য করে।
Read more