Skill

Mocks এবং Stubs (মকস এবং স্টাবস)

আরএসপেক (RSpec) - Computer Programming

316

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
end

Mocks এবং Stubs এর মধ্যে পার্থক্য

বৈশিষ্ট্যMocksStubs
কাজঅন্য অবজেক্ট বা মেথডের সাথে ইন্টারঅ্যাকশন যাচাই করামেথডের ফলাফল সরবরাহ করা, অন্য কোনো অবজেক্টের ইন্টারঅ্যাকশন না করেই
ব্যবহারমেথডের কল, আর্গুমেন্ট বা আচরণ যাচাই করামেথডের আউটপুট কাস্টমাইজ করা
আউটপুটপ্রত্যাশিত আউটপুট যদি মেথড কল করা হয় তবে টেস্ট পাস হয়কাস্টম আউটপুট সরবরাহ করে
ফোকাসমেথড কলের সাথে সম্পর্কিত (কোনো নির্দিষ্ট কল বা আচরণ)মেথডের আউটপুট বা ফলাফলের উপর ফোকাস

সারাংশ

  • Mocks সাধারণত কোনো অবজেক্ট বা মেথডের কল যাচাই করতে ব্যবহৃত হয়, যেমন এটি নির্দিষ্ট আর্গুমেন্ট ব্যবহার করছে কিনা বা ঠিক মতো কল হচ্ছে কিনা।
  • Stubs কোনো নির্দিষ্ট মেথডের আউটপুট কাস্টমাইজ করতে ব্যবহৃত হয়, যাতে বাহ্যিক নির্ভরশীলতা বা অন্যান্য সিস্টেমের প্রয়োজন না হয়।

মকস এবং স্টাবস, দুইই টেস্টিংয়ের একটি গুরুত্বপূর্ণ অংশ, যা কোডের নির্ভরশীলতা নিয়ন্ত্রণ করে এবং নির্দিষ্ট আচরণ বা ফলাফল পরীক্ষা করতে সহায়ক।

Content added By

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 মেথডটিকে স্টাব করা হয়েছে এবং withand_return দ্বারা নির্দিষ্ট আউটপুট প্রদান করা হয়েছে।


Mocks এবং Stubs এর মধ্যে পার্থক্য

বৈশিষ্ট্যMocksStubs
প্রধান লক্ষ্যকলের প্রত্যাশা পরীক্ষা করানির্দিষ্ট আউটপুট প্রদান করা
ব্যবহারআচরণ যাচাই করা (কতবার কল হয়েছে)নির্দিষ্ট আউটপুট প্রদান করা
পরীক্ষাকলের প্রতিক্রিয়া ও আচরণ পরীক্ষাশুধুমাত্র আউটপুট পরীক্ষা করা
ভুল হলেযদি কল প্রত্যাশিত না হয়, তাহলে টেস্ট ব্যর্থ হয়যদি ফলাফল সঠিক না হয়, তাহলে টেস্ট ব্যর্থ হয়

সারাংশ

Mocks এবং Stubs হল টেস্টিং টুলস যা বাহ্যিক নির্ভরশীলতাগুলিকে মক বা স্টাব করতে সাহায্য করে। Mocks ব্যবহার করা হয় যখন নির্দিষ্ট আচরণ বা কল পরীক্ষা করতে হয় এবং Stubs ব্যবহার করা হয় যখন নির্দিষ্ট আউটপুট প্রদান করতে হয়। এগুলি ডেভেলপারদের তাদের কোডের লজিক পরীক্ষা করতে সাহায্য করে, বাহ্যিক সিস্টেম বা উপাদানগুলোকে টেস্টের বাইরে রেখে।

Content added By

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-এ টেস্ট লেখার সময় ডিপেন্ডেন্সি মকিং এবং স্টাবিংয়ের জন্য গুরুত্বপূর্ণ ভূমিকা পালন করে।

Content added By

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 করার জন্য মকিং এবং স্পাইিং দুটি শক্তিশালী টুল। মকিংয়ের মাধ্যমে আপনি মেথড বা ক্লাসের আচরণ বদলাতে পারেন, এবং স্পাইিংয়ের মাধ্যমে মেথড কলের কার্যকারিতা যাচাই করতে পারেন। এই দুটি পদ্ধতি ব্যবহার করে আপনি আপনার কোডের সঠিকতা যাচাই করার পাশাপাশি তার আচরণ নিয়ন্ত্রণও করতে পারবেন।

Content added By

Test Doubles হল এমন একটি কৌশল যা সফটওয়্যার টেস্টিংয়ের সময়, বিশেষত ইউনিট টেস্টিং বা ইন্টিগ্রেশন টেস্টিং এ ব্যবহৃত হয়, যেখানে টেস্টিং কোডের নির্ভরশীলতা (dependencies) অথবা বাহ্যিক সিস্টেম (যেমন ডাটাবেস, API, ফাইল সিস্টেম ইত্যাদি) সিমুলেট (অনুকরণ) করা হয়। এই অনুকৃত অবজেক্টগুলোকে Test Doubles বলা হয়, কারণ তারা আসল অবজেক্টের মতোই কাজ করে, কিন্তু শুধুমাত্র টেস্টিং উদ্দেশ্যে ব্যবহৃত হয়।

Test Doubles এর মাধ্যমে, টেস্টিংয়ের সময় বাহ্যিক সিস্টেম বা কোডের নির্ভরশীলতা মক বা স্টাব করা যায়, যা টেস্টকে আরও দ্রুত, নির্ভুল এবং কন্ট্রোলেবল করে তোলে। এতে রিয়েল ডেটা বা প্রকৃত সিস্টেমের যোগাযোগ ছাড়াই শুধুমাত্র সেই অংশটির কার্যকারিতা পরীক্ষা করা সম্ভব হয় যা আপনি টেস্ট করতে চান।


Test Doubles এর ধরনসমূহ

Test Doubles বিভিন্ন ধরনের হতে পারে, যার মধ্যে কিছু সাধারণ ধরনের হলো:

  1. 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
    end
  2. Stubs:

    • 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
    end
  3. Spies:

    • 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
  4. Fakes:
    • Fakes হল এমন বাস্তব অবজেক্ট যেগুলো সাধারণত সম্পূর্ণভাবে বাস্তব নয়, কিন্তু তারা সাধারণভাবে ডেভেলপমেন্ট পরিবেশে কাজ করে। Fakes ব্যবহার করে একটি নির্দিষ্ট কাজ সাধিত হয়, তবে তারা প্রকৃত সিস্টেমের মতো কাজ না করতে পারে।
    • উদাহরণস্বরূপ, একটি ফেক ডাটাবেস যা কেবল ডেটা সেভ বা রিট্রিভ করার সহজ প্রক্রিয়া অনুকরণ করে।

Test Doubles এর প্রয়োজনীয়তা

  1. বাহ্যিক নির্ভরশীলতা এবং এক্সটার্নাল সিস্টেমের থেকে মুক্তি: যখন বাহ্যিক সিস্টেম (যেমন API, ডাটাবেস) ব্যবহার করতে পারি না বা সেগুলোর সঙ্গে কাজ করা সম্ভব নয়, তখন Test Doubles ব্যবহৃত হয়।
  2. টেস্টের গতিশীলতা ও নির্ভুলতা: Test Doubles ব্যবহার করে টেস্টগুলি দ্রুত চালানো যায় কারণ বাহ্যিক সিস্টেমের সাথে যোগাযোগের সময়ের প্রয়োজন হয় না। পাশাপাশি, বাহ্যিক সিস্টেমের পরিবর্তন টেস্টের ফলাফলে প্রভাব ফেলবে না।
  3. টেস্টের নির্ভুলতা: বাহ্যিক সিস্টেমের পরিবর্তন অথবা গোলমালের কারণে কোডে ভুল প্রভাব না পড়ে সঠিকভাবে নির্দিষ্ট ফিচারের আচরণ পরীক্ষা করা সম্ভব হয়।
  4. অপর্যাপ্ত ডেটার জন্য: যখন ডেটাবেসে পর্যাপ্ত ডেটা থাকে না অথবা ডেটা আনুপাতিক না হলে, তখন Test Doubles ব্যবহার করে সেই আচরণ পরীক্ষা করা যায়।
  5. কমপ্লেক্স সিস্টেমে কাজ করার সময়: যদি সিস্টেমে অনেক ইন্টারঅ্যাকশন বা সিস্টেম ডিপেন্ডেন্সি থাকে, তবে সেগুলোর অনুকরণ করে টেস্ট লেখা সহজ হয়।

Test Doubles এর ব্যবহার

  1. ইউনিট টেস্টিং: Test Doubles ব্যবহার করে নির্দিষ্ট ইউনিটের ফাংশনালিটি পরীক্ষা করা, যেমন মেথড কল বা আউটপুট।
  2. ইন্টিগ্রেশন টেস্টিং: বহিরাগত সিস্টেমের সাথে যোগাযোগ না করে বিভিন্ন সিস্টেমের মধ্যে যোগাযোগ পরীক্ষা করা।
  3. রিগ্রেশন টেস্টিং: পূর্ববর্তী ত্রুটি এবং বর্তমান ফিচারের মধ্যে সম্পর্ক পরীক্ষা করা।

সারাংশ

Test Doubles হল সফটওয়্যার টেস্টিংয়ের শক্তিশালী টুল যা বাহ্যিক নির্ভরশীলতা এবং সিস্টেমের সঙ্গে যোগাযোগ ছাড়া নির্দিষ্ট ফিচারের আচরণ পরীক্ষা করতে ব্যবহৃত হয়। Mocks, Stubs, Spies, এবং Fakes এগুলোর প্রধান প্রকার, যা বিভিন্ন পরিস্থিতিতে ব্যবহৃত হয় টেস্টের কার্যকারিতা, গতি এবং নির্ভুলতা উন্নত করতে। Test Doubles ব্যবহারের মাধ্যমে ডেভেলপাররা সহজে নির্ভরশীলতাগুলি মক করে, এক্সটার্নাল সিস্টেমের কোনো প্রভাব ছাড়াই কোডের সঠিকতা নিশ্চিত করতে পারেন।

Content added By
Promotion

Are you sure to start over?

Loading...