Mocking এবং Stubbing টেস্ট ডেটা
Mocking এবং Stubbing হল Test Doubles কৌশল, যা টেস্টিংয়ের সময় সিস্টেমের কিছু অংশের আচরণ চেক করতে ব্যবহৃত হয়। Elixir তে, বিশেষত ExUnit টেস্টিং ফ্রেমওয়ার্কে, এগুলি ব্যবহার করে আপনি পরীক্ষার সময় নির্দিষ্ট অংশগুলিকে নিয়ন্ত্রণ করতে পারেন। Mocking এবং Stubbing ব্যবহার করে আপনি টেস্টে নির্দিষ্ট ফাংশন বা সার্ভিসের আচরণ কাস্টমাইজ করে সেটি পরীক্ষা করতে পারেন, যেগুলি বাস্তব পরিবেশে সঠিকভাবে কাজ করবে না বা যা আপনার টেস্টের জন্য উপযুক্ত নয়।
এখানে Mocking এবং Stubbing এর মধ্যে পার্থক্য এবং Elixir তে এগুলির ব্যবহার সম্পর্কে বিস্তারিত আলোচনা করা হলো।
1. Stubbing (স্টাবিং)
Stubbing হল একটি টেস্টিং কৌশল যেখানে আপনি একটি নির্দিষ্ট ফাংশনের আচরণ স্টাব (simulate) করে তার আউটপুট পরিবর্তন করেন। সাধারণত, একটি ফাংশন যদি কোন নির্দিষ্ট মান রিটার্ন করে এবং সেটি টেস্টে প্রয়োজন না হয়, তাহলে stubbing এর মাধ্যমে আমরা সেই মানটি প্রিসেট করে দেই, যাতে টেস্টের সময় সেই ফাংশনটি আমাদের দেওয়া মান রিটার্ন করে।
Stubbing এর উদাহরণ:
ধরা যাক, আপনার কাছে একটি User মডিউল রয়েছে এবং এটি একটি বাহ্যিক API কল করে। আপনি যদি API কলের পরিবর্তে টেস্টে একটি প্রিসেট ডেটা ব্যবহার করতে চান, তাহলে স্টাবিং ব্যবহার করতে পারেন।
defmodule MyApp.User do
def get_user_data(user_id) do
# এখানে API কল হতে পারে
# HTTP.get("http://example.com/api/users/#{user_id}")
{:ok, %{id: user_id, name: "Alice"}}
end
endএখন, যদি আপনি এই get_user_data ফাংশনের আউটপুট স্টাব করতে চান, তাহলে আপনি পরীক্ষার সময় এই ফাংশনের ফলাফল সেট করতে পারেন:
defmodule MyApp.UserTest do
use ExUnit.Case
test "get_user_data returns stubbed user data" do
# স্টাবিং করা
stubbed_data = %{id: 1, name: "Bob"}
assert MyApp.User.get_user_data(1) == stubbed_data
end
endএখানে, get_user_data/1 ফাংশনটি যেহেতু স্টাব করা হয়নি, আপনি সেটিকে আপনার প্রয়োজন অনুযায়ী নির্দিষ্ট ডেটা রিটার্ন করতে পারেন, যেমন {id: 1, name: "Bob"}।
2. Mocking (মকিং)
Mocking হল একটি কৌশল যেখানে আপনি নির্দিষ্ট ফাংশন বা সার্ভিসের সমস্ত আচরণকে কাস্টমাইজ করেন, বিশেষত তাদের আউটপুট বা প্রভাবকে। আপনি যখন মকিং ব্যবহার করেন, তখন আপনি নির্দিষ্ট ফাংশনগুলোর মধ্যে interaction পরীক্ষা করতে পারেন এবং সেই ফাংশনের আচরণ পরিবর্তন করতে পারেন, যেমন এটি কোন ভ্যালু রিটার্ন করবে বা কিভাবে এটি অন্যান্য ফাংশনের সাথে কাজ করবে।
Elixir তে মকিং করার জন্য সাধারণত Mox লাইব্রেরি ব্যবহৃত হয়। Mox একটি লাইব্রেরি যা আপনাকে মক অবজেক্ট তৈরি করতে এবং তাদের আচরণ কাস্টমাইজ করতে সাহায্য করে।
Mox ব্যবহার করা:
প্রথমে, Mox লাইব্রেরিটি আপনার প্রোজেক্টে যোগ করতে হবে:
# mix.exs ফাইলে dependency যোগ করুন
defp deps do
[
{:mox, "~> 0.5", only: :test}
]
endতারপর, টেস্টে মক তৈরি করার জন্য Mox ব্যবহার করা যেতে পারে:
defmodule MyApp.ExternalAPI do
def get_data(id) do
# এখানে বাহ্যিক API কল হতে পারে
# HTTP.get("http://api.com/data/#{id}")
{:ok, %{id: id, value: "real data"}}
end
endএখন, যদি আপনি এই get_data/1 ফাংশনটির মক করতে চান, তাহলে আপনি টেস্টে Mox এর মাধ্যমে সেটি করতে পারেন।
defmodule MyApp.ExternalAPITest do
use ExUnit.Case
import Mox
# মক তৈরি করা
defmock(MyApp.MockExternalAPI, for: MyApp.ExternalAPI)
setup :verify_on_exit!
test "testing mocked data" do
# মক আচরণ সেট করা
MyApp.MockExternalAPI
|> expect(:get_data, fn _id -> {:ok, %{id: 1, value: "mocked data"}} end)
# মক ফাংশন কল করা
assert MyApp.ExternalAPI.get_data(1) == {:ok, %{id: 1, value: "mocked data"}}
end
endএখানে, MyApp.MockExternalAPI একটি মক তৈরি করেছে, এবং আমরা সেটির get_data ফাংশনের জন্য কাস্টম আচরণ সেট করেছি, যাতে এটি {id: 1, value: "mocked data"} রিটার্ন করে।
Mocking এবং Stubbing এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | Stubbing | Mocking |
|---|---|---|
| ব্যবহার | ফাংশন বা মেথডের আউটপুট পরিবর্তন করা। | ফাংশন বা মেথডের পুরো আচরণ পরিবর্তন করা। |
| কাস্টমাইজেশন | শুধুমাত্র আউটপুট বা রিটার্ন মান কাস্টমাইজ করা। | রিটার্ন মান, ফাংশন কলের সংখ্যা, সাইড এফেক্ট কাস্টমাইজ করা। |
| পরীক্ষা | সাধারণত সিম্পল আউটপুট পরীক্ষার জন্য ব্যবহৃত। | সাধারণত ফাংশন বা সার্ভিসের ইন্টারঅ্যাকশন পরীক্ষা করতে ব্যবহৃত। |
| লাইব্রেরি | Elixir এর মধ্যে Stub ফাংশন সরাসরি ব্যবহার করা হয়। | Mox লাইব্রেরি বা অন্যান্য মকিং লাইব্রেরি ব্যবহৃত হয়। |
| পর্যাপ্ততা | ছোট টেস্টের জন্য উপযুক্ত যেখানে নির্দিষ্ট আউটপুট প্রয়োজন। | বৃহত্তর টেস্টিং কেসে, যেখানে বাহ্যিক ইন্টারঅ্যাকশন বা আউটপুট সঠিকভাবে পরীক্ষা করা দরকার। |
Conclusion
- Stubbing হল একটি টেস্টিং কৌশল, যেখানে নির্দিষ্ট ফাংশনের আউটপুট প্রিসেট করে সেটি পরীক্ষার জন্য ব্যবহার করা হয়।
- Mocking হল আরো উন্নত একটি কৌশল, যেখানে আপনি ফাংশনের পুরো আচরণ, যেমন রিটার্ন মান এবং সাইড এফেক্ট কাস্টমাইজ করতে পারেন, এবং এটি সাধারণত বড় টেস্ট কেসের জন্য ব্যবহৃত হয়।
- Elixir তে Mox লাইব্রেরি ব্যবহার করে আপনি মক তৈরি এবং পরীক্ষা করতে পারেন, যা আপনার টেস্টিং প্রয়োজনে অত্যন্ত কার্যকরী।
Read more