Testing in Elixir (ইউনিট টেস্টিং)
Elixir তে Testing একটি অত্যন্ত গুরুত্বপূর্ণ অংশ, যা কোডের নির্ভরযোগ্যতা নিশ্চিত করতে সহায়তা করে। Elixir এর নিজস্ব টেস্টিং ফ্রেমওয়ার্ক ExUnit এর মাধ্যমে সহজে ইউনিট টেস্ট তৈরি এবং চালানো যায়। ExUnit ফ্রেমওয়ার্ক Elixir কোডের বিভিন্ন অংশের কার্যকারিতা যাচাই করার জন্য ব্যবহৃত হয় এবং এটি Elixir প্রজেক্টে ইন্টিগ্রেটেড থাকে।
এখানে Elixir তে ইউনিট টেস্টিং এর ব্যবহারের পদ্ধতি, ExUnit এর কমান্ড এবং টেস্টিংয়ের গুরুত্ব সম্পর্কে বিস্তারিত আলোচনা করা হলো।
১. ExUnit: Elixir এর টেস্টিং ফ্রেমওয়ার্ক
ExUnit হল Elixir এর বিল্ট-ইন টেস্টিং ফ্রেমওয়ার্ক যা ইউনিট টেস্টিং, ইনটিগ্রেশন টেস্টিং এবং অন্যান্য ধরনের টেস্ট পরিচালনা করার জন্য ব্যবহৃত হয়। ExUnit Elixir প্রজেক্টে একত্রিত থাকে এবং আপনি সহজেই টেস্ট ফাইল তৈরি, টেস্ট রান এবং ফলাফল দেখতে পারেন।
ExUnit এর মূল বৈশিষ্ট্য:
- Test Cases: পৃথক কোড অংশের কার্যকারিতা যাচাই করা।
- Assertions: কোডের ফলাফল যাচাই করার জন্য assertions ব্যবহার করা হয়।
- Fixtures: টেস্টের পূর্ববর্তী বা পরবর্তী ধাপে ডেটা প্রস্তুত করা।
- Running Tests: টেস্ট রান এবং ফলাফল দেখতে
mix testকমান্ড।
২. Elixir তে টেস্টিং শুরু করা
Elixir প্রজেক্টে ExUnit ব্যবহারের জন্য সাধারণত test ফোল্ডার তৈরি করতে হয় যেখানে টেস্ট ফাইল রাখা হবে। প্রজেক্টের যে অংশটি টেস্ট করা হবে, সেই অংশে টেস্ট ফাইল তৈরি করুন এবং সেখানে ExUnit এর মাধ্যমে টেস্ট ফাংশন তৈরি করুন।
নতুন টেস্ট ফাইল তৈরি করা:
# test/my_module_test.exs
defmodule MyModuleTest do
use ExUnit.Case # ExUnit টেস্টিং ফ্রেমওয়ার্ক ব্যবহার
test "the truth" do
assert 1 + 1 == 2 # Assertion: 1 + 1 হওয়া উচিত 2
end
endএখানে, "the truth" নামক একটি টেস্ট তৈরি করা হয়েছে যা যাচাই করবে যে 1 + 1 আসলেই 2 কিনা।
৩. ExUnit এর কমান্ড এবং ফাংশন
use ExUnit.Case:
এই কিওয়ার্ডটি ExUnit ফ্রেমওয়ার্কের মধ্যে টেস্ট কেস অন্তর্ভুক্ত করার জন্য ব্যবহৃত হয়। এর মাধ্যমে আপনি টেস্টিং ফাংশন লিখতে পারবেন।
test:
test হল একটি ব্লক যা কোডের কার্যকারিতা যাচাই করার জন্য ব্যবহার করা হয়। এটি একটি নাম এবং কোড সংবলিত ব্লক থাকে।
test "description of the test" do
assert condition
endassert:
assert ব্যবহৃত হয় একটি শর্ত যাচাই করার জন্য। যদি শর্ত সত্য হয়, তবে টেস্ট সফল হবে।
assert 2 + 2 == 4refute:
refute ব্যবহৃত হয় কোনও শর্ত মিথ্যা বা অপর্যাপ্ত হওয়ার জন্য।
refute 1 + 1 == 3 # এখানে টেস্ট সফল হবে, কারণ 1 + 1 != 3setup এবং teardown:
setup এবং teardown ব্যবহৃত হয় টেস্টের পূর্বে এবং পরে কিছু প্রস্তুতি বা পরিস্কার করার জন্য।
defmodule MyTest do
use ExUnit.Case
setup do
# প্রস্তুতি কোড
:ok
end
test "some test" do
assert true
end
endএখানে, setup ব্লকটি টেস্টের আগে রান হবে এবং টেস্টের পরের কাজগুলি সম্পাদনের জন্য teardown ব্যবহার করা যেতে পারে।
৪. টেস্ট রান করা
Elixir তে টেস্ট রান করতে mix test কমান্ড ব্যবহার করা হয়।
টেস্ট রান করার উদাহরণ:
mix testএটি আপনার test/ ডিরেক্টরির সমস্ত টেস্ট ফাইল রান করবে এবং ফলাফল দেখাবে।
একটি নির্দিষ্ট টেস্ট রান করা:
mix test test/my_module_test.exsএটি test/my_module_test.exs ফাইলটি রান করবে।
কিছু নির্দিষ্ট টেস্ট রান করা:
mix test --only some_tagএখানে, আপনি নির্দিষ্ট টেস্টগুলি চালাতে পারেন যেগুলি একটি নির্দিষ্ট ট্যাগ ব্যবহার করছে।
৫. টেস্টের ফলাফল
টেস্ট রান করার পর, Elixir আপনাকে বিভিন্ন ধরনের ফলাফল দেখাবে:
- OK: টেস্ট সফলভাবে সম্পন্ন হয়েছে।
- Failed: কোনো টেস্ট ব্যর্থ হয়েছে।
- Skipped: কোনো টেস্ট এড়িয়ে গিয়েছে।
টেস্টের আউটপুট:
Finished in 0.03 seconds
1 test, 0 failures, 0 skipped, 0 excluded
Randomized with seed 1234567890এটি আপনার টেস্টের সংখ্যা, ব্যর্থ টেস্ট, স্কিপড টেস্ট এবং এক্সক্লুডেড টেস্টের ফলাফল দেখাবে।
৬. Complex Assertions (কাম্পলেক্স অ্যাসারশন)
Elixir তে আপনি আরও উন্নত assertions করতে পারেন, যেমন মানের মধ্যে তুলনা, বা বিশেষ শর্ত যাচাই করা। এর জন্য assert এবং refute এর সাথে আরও বিভিন্ন ফাংশন ব্যবহার করা হয়।
উন্নত Assertions উদাহরণ:
assert [1, 2, 3] == Enum.sort([3, 2, 1])
assert_raise ArgumentError, fn -> raise ArgumentError endএখানে, প্রথমটি যাচাই করছে যে [1, 2, 3] একটি sorted তালিকা হতে হবে। দ্বিতীয়টি যাচাই করছে যে একটি ArgumentError ত্রুটি তৈরি হবে।
৭. Mocking এবং Stubbing (Mocking এবং Stubbing)
টেস্টে বাহ্যিক ডিপেন্ডেন্সির সাথে কাজ করার জন্য mocking এবং stubbing ব্যবহার করা হয়। Elixir তে আপনি Mox বা Meck লাইব্রেরি ব্যবহার করে এই কাজগুলো করতে পারেন।
৮. Test Coverage (টেস্ট কাভারেজ)
Elixir তে test coverage ট্র্যাক করার জন্য আপনি mix coveralls কমান্ড ব্যবহার করতে পারেন, যা আপনার কোডের কতটা অংশ টেস্ট করা হয়েছে তা দেখায়।
Test Coverage উদাহরণ:
mix deps.get
mix test --coverএটি টেস্ট কভারেজ রিপোর্ট তৈরি করবে যা আপনাকে দেখাবে কোন অংশটি টেস্ট করা হয়েছে এবং কোনটি হয়নি।
সারসংক্ষেপ
Elixir তে ExUnit ফ্রেমওয়ার্ক ব্যবহার করে আপনি ইউনিট টেস্টিং সহজেই করতে পারেন। test ব্লক, assert/refute assertions, setup/teardown এবং টেস্ট রান করার বিভিন্ন কৌশল ব্যবহার করে আপনি কোডের কার্যকারিতা যাচাই করতে পারেন। এর মাধ্যমে আপনি কোডের বাগ চিহ্নিত করতে পারেন এবং কোডের উন্নতি করতে সাহায্য পেতে পারেন। Elixir এর টেস্টিং ফিচারগুলি একত্রে কোডের স্থিতিস্থাপকতা, পারফরম্যান্স এবং বিশ্বাসযোগ্যতা নিশ্চিত করতে সহায়তা করে।
Elixir তে ExUnit ফ্রেমওয়ার্ক ব্যবহার করে Unit Testing
ExUnit হল Elixir তে একটি টেস্টিং ফ্রেমওয়ার্ক যা ইউনিট টেস্ট (Unit Testing) লিখতে এবং চালানোর জন্য ব্যবহৃত হয়। এটি Elixir তে টেস্টিংয়ের জন্য একটি শক্তিশালী এবং সহজ উপায় সরবরাহ করে। ExUnit ফ্রেমওয়ার্কটি মূলত assertion-based testing সাপোর্ট করে এবং আপনি বিভিন্ন অ্যাসারশন ব্যবহার করে আপনার কোডের কার্যকারিতা যাচাই করতে পারেন।
Elixir তে টেস্টিং খুবই গুরুত্বপূর্ণ, বিশেষ করে যখন আপনি বড় এবং জটিল সিস্টেম তৈরি করছেন। ExUnit ফ্রেমওয়ার্কের মাধ্যমে আপনি ছোট ছোট ইউনিট টেস্ট লিখে আপনার কোডের অপ্রত্যাশিত ত্রুটি শনাক্ত করতে পারবেন।
1. ExUnit ফ্রেমওয়ার্ক ইন্সটলেশন এবং কনফিগারেশন
ExUnit ফ্রেমওয়ার্ক Elixir এর সাথে ডিফল্টভাবেই অন্তর্ভুক্ত থাকে, তাই আপনাকে আলাদা করে ইন্সটল করতে হয় না। তবে, প্রথমে আপনাকে ExUnit কে সক্রিয় করতে হবে এবং টেস্ট চালানোর আগে সেটিকে কনফিগার করতে হবে।
ExUnit সক্রিয় করা:
প্রথমে, ExUnit.start/0 ফাংশনটি আপনার প্রজেক্টের মধ্যে কল করতে হবে।
ExUnit.start()এটি আপনার টেস্ট রান করার পরিবেশ প্রস্তুত করবে।
2. টেস্ট ফাইল তৈরি করা
Elixir প্রজেক্টে টেস্ট লিখতে test/ ডিরেক্টরিতে ফাইল তৈরি করা হয়। আপনার কোডের জন্য একটি টেস্ট ফাইল তৈরি করুন এবং সেখানে আপনার টেস্ট লিখুন।
টেস্ট ফাইল স্ট্রাকচার:
my_project/
├── lib/
│ └── my_project.ex
├── test/
│ └── my_project_test.exs
└── mix.exsএখানে, my_project_test.exs ফাইলটি আপনার টেস্ট লিখার জায়গা। প্রতিটি টেস্ট ফাইলে টেস্ট কেস ডিফাইন করতে হবে।
3. ExUnit টেস্ট কেস লিখা
ExUnit এর টেস্ট কেস লিখতে use ExUnit.Case মডিউলটি ব্যবহার করা হয়। এর মধ্যে test/2 ফাংশন ব্যবহার করে আপনার টেস্ট কেস ডিফাইন করবেন। test ব্লকে অ্যাসারশনগুলো লিখতে হয়, যেগুলি আপনার কোডের সঠিকতা যাচাই করে।
টেস্ট কেস লেখা উদাহরণ:
defmodule MyProjectTest do
use ExUnit.Case
test "1 + 1 equals 2" do
assert 1 + 1 == 2
end
test "string concatenation" do
assert "Hello, " <> "Elixir!" == "Hello, Elixir!"
end
endএখানে, প্রথম টেস্টে assert ব্যবহার করা হয়েছে যা চেক করে যে 1 + 1 সত্যিই 2 কিনা। দ্বিতীয় টেস্টে স্ট্রিং কনক্যাটেনেশন চেক করা হয়েছে।
4. টেস্ট চালানো
আপনার টেস্ট ফাইল প্রস্তুত হলে, আপনি mix test কমান্ড দিয়ে টেস্ট চালাতে পারেন। এটি আপনার সকল টেস্ট ফাইল রান করবে এবং ফলাফল দেখাবে।
টেস্ট চালানো:
mix testএটি সমস্ত টেস্ট ফাইলগুলো রান করবে এবং টেস্টের ফলাফল প্রদর্শন করবে। উদাহরণস্বরূপ:
..
Finished in 0.02 seconds
2 tests, 0 failuresযদি কোনো টেস্ট ফেইল হয়, তবে বিস্তারিত ত্রুটি বার্তা দেখতে পারবেন।
5. টেস্টের মধ্যে Assertions
ExUnit এ বিভিন্ন ধরনের অ্যাসারশন ব্যবহৃত হতে পারে। এখানে কিছু সাধারণ অ্যাসারশনের উদাহরণ:
assert: এই অ্যাসারশনটি একটি শর্ত যদি সত্য (true) হয়, তবে টেস্টটি সফল হবে।
assert 2 + 2 == 4refute: এই অ্যাসারশনটি একটি শর্ত যদি মিথ্যা (false) হয়, তবে টেস্টটি সফল হবে।
refute 2 + 2 == 5assert_raise: এই অ্যাসারশনটি চেক করে যে, একটি নির্দিষ্ট এক্সসেপশন ঘটছে কি না।
assert_raise ArithmeticError, fn -> 1 / 0 endassert_in_delta: এই অ্যাসারশনটি ফ্লোট ভ্যালুর মধ্যে একটি মার্জিন (delta) চেক করে।
assert_in_delta 3.14, 3.14159, 0.01assert_received: এই অ্যাসারশনটি মেসেজ রিসিভের জন্য ব্যবহৃত হয়, যেমন যদি একটি প্রক্রিয়া মেসেজ পাঠায় এবং আপনি সেই মেসেজটি পেয়েছেন কি না তা যাচাই করতে।
assert_received {:message, "Hello"}
6. টেস্ট কেস গ্রুপিং (Test Setup and Teardown)
ExUnit আপনাকে setup এবং teardown ফাংশন ব্যবহার করতে দেয় যাতে প্রতিটি টেস্টের আগে কিছু ইনিশিয়ালাইজেশন বা পরে পরিষ্কারকরণ করা যায়।
setup এবং teardown উদাহরণ:
defmodule MyProjectTest do
use ExUnit.Case
setup do
{:ok, initial_data: 10}
end
test "using setup data", context do
assert context[:initial_data] == 10
end
endএখানে, setup ফাংশন একটি কনটেক্সট (context) প্রদান করে যা টেস্টের মধ্যে ব্যবহৃত হয়।
7. টেস্ট কভারেজ
Elixir তে mix test.coverage ব্যবহার করে আপনি টেস্ট কভারেজ দেখতে পারেন। এটি টেস্ট চলাকালীন আপনার কোডের কতটা অংশ টেস্ট করা হয়েছে তা দেখায়।
mix test --coverএটি আপনাকে একটি কভারেজ রিপোর্ট প্রদান করবে যা দেখাবে কেমনভাবে আপনার টেস্ট কোড কভার করছে।
সারসংক্ষেপ
ExUnit Elixir তে ইউনিট টেস্ট লেখার এবং চালানোর জন্য একটি অত্যন্ত কার্যকরী ফ্রেমওয়ার্ক। এর মাধ্যমে আপনি:
- বিভিন্ন ধরনের অ্যাসারশন ব্যবহার করে আপনার কোড পরীক্ষা করতে পারেন
- টেস্টের জন্য setup এবং teardown পরিচালনা করতে পারেন
- সহজেই টেস্ট চালিয়ে ফলাফল পেতে পারেন
ExUnit ব্যবহারের মাধ্যমে আপনি Elixir প্রজেক্টের কোডের কার্যকারিতা, নিরাপত্তা এবং নির্ভরযোগ্যতা নিশ্চিত করতে পারবেন।
Elixir: ExUnit ফ্রেমওয়ার্ক ব্যবহার করে Unit Testing, Test Cases এবং Test Suites তৈরি
Elixir তে ExUnit একটি অন্তর্নিহিত টেস্টিং ফ্রেমওয়ার্ক যা ইউনিট টেস্টিং (unit testing) করতে ব্যবহৃত হয়। ExUnit এর মাধ্যমে আপনি সহজেই টেস্ট কেস (test cases) এবং টেস্ট সুইট (test suites) তৈরি করতে পারেন যা কোডের ভ্যালিডিটি এবং কার্যকারিতা যাচাই করতে সাহায্য করে।
1. ExUnit ফ্রেমওয়ার্ক ব্যবহার করে Unit Testing
ExUnit এর মাধ্যমে আপনি Elixir কোডের ছোট ছোট অংশ (functions, modules) পরীক্ষা করতে পারেন। এর মাধ্যমে assertions তৈরি করে যাচাই করা হয় যে, আপনার কোড সঠিকভাবে কাজ করছে কিনা। ExUnit ডিফল্টভাবে Elixir তে টেস্টিং ফ্রেমওয়ার্ক হিসেবে আসে, এবং এর সাথে কিছু বিশেষ টুলস যেমন assert এবং refute থাকে।
ExUnit এর ইনিশিয়াল সেটআপ:
ExUnit ব্যবহারের জন্য প্রথমে আপনাকে use ExUnit.Case দিয়ে একটি মডিউল তৈরি করতে হবে এবং সেই মডিউলের মধ্যে টেস্টগুলি লিখতে হবে।
# টেস্ট মডিউল তৈরি করা
defmodule MyTest do
use ExUnit.Case
test "basic addition" do
assert 1 + 1 == 2 # assert ব্যবহৃত হয়েছে টেস্টের জন্য
end
endএখানে, assert টেস্টটি নিশ্চিত করে যে, 1 + 1 এর ফলাফল 2 এর সমান কিনা। ExUnit একে test ব্লক হিসেবে শনাক্ত করবে এবং ফলাফল দেখাবে।
2. Test Cases তৈরি
Test Case হল একটি ছোট কোড ব্লক যা কোনো নির্দিষ্ট ফাংশন বা লজিক পরীক্ষা করে। Elixir তে ExUnit ব্যবহার করে test cases তৈরি করা হয় এবং সাধারণত test ব্লক ব্যবহার করে এগুলিকে ডিফাইন করা হয়।
Test Case এর উদাহরণ:
defmodule MathTest do
use ExUnit.Case
test "addition of two numbers" do
assert 2 + 3 == 5
end
test "multiplication of two numbers" do
assert 2 * 3 == 6
end
test "subtraction of two numbers" do
assert 5 - 3 == 2
end
endএখানে, MathTest মডিউলে তিনটি test cases তৈরি করা হয়েছে:
- প্রথমটি যোগফল যাচাই করে।
- দ্বিতীয়টি গুণফল যাচাই করে।
- তৃতীয়টি বিয়োগফল যাচাই করে।
টেস্ট চালানো:
Elixir তে mix test কমান্ড ব্যবহার করে আপনি টেস্ট চালাতে পারেন:
mix testএটি টেস্ট ফলাফল দেখাবে এবং কোন টেস্ট সফল হয়েছে বা ব্যর্থ হয়েছে তা জানাবে।
3. Test Suites তৈরি
Test Suite হল একাধিক টেস্ট কেসের একটি গ্রুপ যা একত্রে চলতে পারে। Elixir তে test suite তৈরি করার জন্য একাধিক টেস্ট মডিউল ব্যবহার করা হয়। একটি test suite সাধারণত একাধিক ফিচার বা ফাংশন পরীক্ষা করার জন্য একত্রিত টেস্ট কেসগুলোর একটি সংগ্রহ।
Test Suite এর উদাহরণ:
defmodule MathTest do
use ExUnit.Case
test "addition of two numbers" do
assert 2 + 3 == 5
end
test "multiplication of two numbers" do
assert 2 * 3 == 6
end
end
defmodule StringTest do
use ExUnit.Case
test "string concatenation" do
assert "hello" <> " " <> "world" == "hello world"
end
test "string length" do
assert String.length("hello") == 5
end
endএখানে, MathTest এবং StringTest দুটি আলাদা টেস্ট মডিউল তৈরি করা হয়েছে। এই দুটি মডিউল একসাথে টেস্ট সুইট হিসেবে কাজ করবে।
Test Suite চালানো:
আপনি mix test কমান্ড দিয়ে পুরো টেস্ট সুইট চালাতে পারেন:
mix testএটি সমস্ত টেস্ট মডিউল এবং তাদের মধ্যে থাকা টেস্ট কেসগুলো একযোগে চালাবে এবং ফলাফল দেখাবে।
4. টেস্ট হুকস (Test Hooks)
Elixir এর ExUnit ফ্রেমওয়ার্কে test hooks রয়েছে যা টেস্ট চলাকালীন কিছু কোড পূর্বে বা পরে এক্সিকিউট করার জন্য ব্যবহৃত হয়। এগুলি সাধারণত setup এবং teardown ফাংশনের মাধ্যমে ব্যবহৃত হয়।
setup এবং teardown:
- setup: টেস্ট চলানোর আগে কিছু প্রিপারেশন বা ডেটা সেটআপ করার জন্য ব্যবহৃত হয়।
- teardown: টেস্ট শেষ হওয়ার পরে কোনো ক্লিনআপ (cleanup) কাজ করার জন্য ব্যবহৃত হয়।
defmodule MyTestWithHooks do
use ExUnit.Case
# setup hook
setup do
{:ok, user: %{name: "Alice", age: 30}}
end
test "test with setup", context do
assert context[:user][:name] == "Alice"
end
endএখানে, setup ব্লকে user ডেটা তৈরি করা হয়েছে এবং টেস্টের মধ্যে এই ডেটা ব্যবহার করা হয়েছে। context অ্যাট্রিবিউটটি টেস্টের মধ্যে অ্যাক্সেস করা হচ্ছে।
5. টেস্টের ফলাফল (Test Result)
mix test চালানোর পরে আপনি টেস্টের ফলাফল দেখতে পাবেন। যদি সমস্ত টেস্ট সফল হয়, তবে এটি কিছু এইভাবে দেখাবে:
Finished in 0.03 seconds
3 tests, 0 failures, 0 skipped, 0 expected failures, 0 invalidযদি কোনো টেস্ট ব্যর্থ হয়, তবে ফলাফল এমন হবে:
Finished in 0.03 seconds
3 tests, 1 failure, 0 skipped, 0 expected failures, 0 invalidএখানে, ব্যর্থ টেস্টের ডিটেইলস সহ টেস্ট ফেইল করতে পারে এমন কারণে যথাযথ মেসেজ দেখানো হবে।
6. ExUnit এর কিছু গুরুত্বপূর্ণ টুলস
- assert: একটি মানের সঠিকতা যাচাই করে।
- refute: একটি শর্তের ভুল হওয়া নিশ্চিত করে।
- assert_raise: একটি এক্সসেপশন ঘটে কি না তা যাচাই করে।
- capture_io: I/O এর আউটপুট ক্যাপচার করে।
assert_raise Example:
test "raises an error" do
assert_raise ArgumentError, fn -> String.to_integer("not a number") end
endcapture_io Example:
test "capturing IO output" do
assert capture_io(fn -> IO.puts("Hello") end) == "Hello\n"
endসারসংক্ষেপ
ExUnit Elixir এর একটি শক্তিশালী টেস্টিং ফ্রেমওয়ার্ক যা ইউনিট টেস্টিং এবং টেস্ট সুইট তৈরি করতে ব্যবহৃত হয়। mix test কমান্ডের মাধ্যমে আপনি আপনার কোডের টেস্ট কেস এবং টেস্ট সুইট চালাতে পারেন। ExUnit ফ্রেমওয়ার্কে আপনি assert এবং refute এর মতো গুরুত্বপূর্ণ টুলস ব্যবহার করে আপনার কোডের ভ্যালিডিটি যাচাই করতে পারেন, এবং setup, teardown এর মতো টেস্ট হুকস ব্যবহার করে আপনার টেস্টের প্রস্তুতি এবং ক্লিনআপ পরিচালনা করতে পারেন।
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 লাইব্রেরি ব্যবহার করে আপনি মক তৈরি এবং পরীক্ষা করতে পারেন, যা আপনার টেস্টিং প্রয়োজনে অত্যন্ত কার্যকরী।
Test Coverage এবং CI/CD Integration in Elixir
Elixir তে Test Coverage এবং CI/CD (Continuous Integration/Continuous Deployment) Integration অত্যন্ত গুরুত্বপূর্ণ, কারণ এগুলি আপনাকে কোডের মান নিশ্চিত করতে এবং নতুন কোডের পরিবর্তন দ্রুত, নির্ভুলভাবে এবং নিরাপদভাবে প্রোডাকশনে ডিপ্লয় করতে সহায়তা করে। Elixir তে টেস্টিং এবং CI/CD ইন্টিগ্রেশন খুবই সহজ, এবং এখানে আমরা কীভাবে এই দুটি কৌশল ব্যবহার করতে পারি তা আলোচনা করবো।
1. Test Coverage in Elixir
Test Coverage হল একটি পরিমাপ যা দেখায় কোডের কতটা অংশ টেস্ট করা হয়েছে। Elixir তে ExUnit মডিউল ব্যবহার করে কোড টেস্ট করা হয় এবং ExCoveralls লাইব্রেরি ব্যবহার করে আপনি test coverage দেখতে পারেন।
ExUnit দিয়ে টেস্টিং
Elixir তে টেস্টিং করার জন্য ExUnit ব্যবহৃত হয়, যা একটি অন্তর্নির্মিত টেস্টিং ফ্রেমওয়ার্ক। এই ফ্রেমওয়ার্কের মাধ্যমে আপনি ইউনিট টেস্ট, ইনটেগ্রেশন টেস্ট এবং অন্যান্য ধরনের টেস্ট লিখতে পারেন।
ExUnit ইনস্টলেশন:
ExUnit Elixir তে ডিফল্টভাবে ইনস্টল থাকে, তাই আপনি সরাসরি ব্যবহার করতে পারবেন। যদি আপনি টেস্ট শুরু করতে চান, তাহলে প্রথমে mix test কমান্ডটি চালান।
ExUnit এর একটি সহজ উদাহরণ:
defmodule MyModuleTest do
use ExUnit.Case
test "simple math" do
assert 1 + 1 == 2
end
test "string comparison" do
assert "hello" == "hello"
end
endএখানে, use ExUnit.Case এর মাধ্যমে টেস্ট কেস তৈরি করা হয়েছে। এর মধ্যে দুটি টেস্ট আছে:
- প্রথমটি ম্যাথ অপারেশন পরীক্ষা করছে।
- দ্বিতীয়টি স্ট্রিং কমপেয়ার করছে।
Test Coverage with ExCoveralls:
Elixir তে ExCoveralls লাইব্রেরি ব্যবহার করে আপনি আপনার কোডের test coverage দেখতে পারেন।
ExCoveralls ইনস্টলেশন:
প্রথমে, আপনার mix.exs ফাইলে ExCoveralls লাইব্রেরিটি যুক্ত করুন:
defp deps do
[
{:excoveralls, "~> 0.14", only: :test}
]
endতারপর, ডিপেনডেন্সি ইনস্টল করতে mix deps.get চালান।
ExCoveralls কনফিগারেশন:
Elixir প্রোজেক্টে ExCoveralls কনফিগার করতে, আপনার mix.exs ফাইলে এটি যুক্ত করুন:
defmodule MyProject.Mixfile do
use Mix.Project
def project do
[
apps: ...,
deps: deps(),
test_coverage: [tool: ExCoveralls]
]
end
endExCoveralls টেস্ট র্যান:
আপনি এখন mix test চালানোর সাথে সাথে test coverage দেখতে পারেন:
mix test
mix coveralls.html # HTML ফরম্যাটে টেস্ট কভারেজ দেখতেএই কমান্ডটি আপনার টেস্ট কভারেজের রিপোর্ট তৈরি করবে, যা coverage/index.html ফাইলের মধ্যে থাকবে।
2. CI/CD Integration in Elixir
Continuous Integration (CI) এবং Continuous Deployment (CD) হল এমন একটি প্রক্রিয়া, যার মাধ্যমে নতুন কোডের পরিবর্তন সিস্টেমে স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত করা হয় এবং সেগুলি পরীক্ষা এবং ডিপ্লয় করা হয়। Elixir প্রোজেক্টের জন্য CI/CD ইন্টিগ্রেশন সেটআপ করা সহজ এবং এতে GitHub Actions, GitLab CI/CD, Jenkins, বা CircleCI ব্যবহার করা যেতে পারে।
GitHub Actions for CI/CD Integration
GitHub Actions Elixir প্রোজেক্টের জন্য CI/CD সেটআপ করতে একটি জনপ্রিয় টুল। এটি আপনাকে কোডের বিল্ড, টেস্ট এবং ডিপ্লয়মেন্ট স্বয়ংক্রিয়ভাবে পরিচালনা করতে সহায়তা করে।
GitHub Actions সেটআপ:
.github/workflowsফোল্ডার তৈরি করুন এবং সেখানে একটি YAML ফাইল (যেমনci.yml) তৈরি করুন।- Elixir CI/CD কনফিগারেশন লিখুন।
GitHub Actions CI/CD Workflow Example:
name: Elixir CI/CD Pipeline
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Elixir
uses: erlef/setup-elixir@v1
with:
elixir-version: '1.13.0'
otp-version: '24.0'
mix-archives: "hex"
- name: Install dependencies
run: |
mix local.hex --force
mix deps.get
mix deps.compile
- name: Run tests
run: mix test
- name: Build release
run: mix release
deploy:
runs-on: ubuntu-latest
needs: build
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Deploy to Server
run: |
scp _build/prod/rel/my_app/releases/0.1.0/my_app.tar.gz user@your_server:/path/to/deployment
ssh user@your_server 'tar -xvzf /path/to/deployment/my_app.tar.gz -C /path/to/deployment'
ssh user@your_server 'cd /path/to/deployment && ./bin/my_app start'ব্যাখ্যা:
buildজবটি কোড চেকআউট, ডিপেনডেন্সি ইনস্টল, টেস্ট রান এবং Mix Release তৈরি করবে।deployজবটি ডিপ্লয়মেন্টের জন্য ফাইল সার্ভারে আপলোড করবে এবং নতুন রিলিজ চালু করবে।
CI/CD Pipeline Features:
- Automated Tests:
mix testদ্বারা স্বয়ংক্রিয়ভাবে টেস্ট রান করা হবে। - Code Coverage:
ExCoverallsটুলটি কোড কভারেজ ট্র্যাক করবে এবং রিপোর্ট দেবে। - Release Build:
mix releaseদ্বারা Elixir অ্যাপ্লিকেশন রিলিজ তৈরি করা হবে। - Deploy: প্রোডাকশন সার্ভারে নতুন রিলিজ ডিপ্লয় করা হবে।
3. Benefits of Test Coverage and CI/CD Integration
- Code Quality Assurance: Test coverage নিশ্চিত করে যে কোডের অধিকাংশ অংশ টেস্ট করা হয়েছে। CI/CD এর মাধ্যমে কোডের পরিবর্তনগুলো দ্রুত পরীক্ষা করা হয় এবং ত্রুটি সনাক্ত করা যায়।
- Faster Development Cycle: CI/CD পিপলাইন ব্যবহারের মাধ্যমে কোডটি দ্রুত এবং সঠিকভাবে ডিপ্লয় করা যায়, ফলে ডেভেলপমেন্ট সাইকেল দ্রুত হয়।
- Automated Testing: একাধিক টেস্ট রান এবং ফাইল ডিপ্লয়মেন্টের কাজ স্বয়ংক্রিয়ভাবে করা হয়, ফলে মানুষের ভুল কমে যায়।
- Bug Detection: Test coverage এবং CI/CD পিপলাইন নিয়মিত কোডের ত্রুটি সনাক্ত করতে সাহায্য করে, যা প্রোডাকশনে গিয়ে বড় সমস্যা হতে পারে।
সারসংক্ষেপ
- Test Coverage: Elixir তে ExUnit এবং ExCoveralls ব্যবহার করে কোডের কভারেজ ট্র্যাক করা এবং টেস্ট করা যায়।
- CI/CD Integration: GitHub Actions বা অন্যান্য CI/CD টুলস ব্যবহার করে Elixir প্রোজেক্টের বিল্ড, টেস্ট এবং ডিপ্লয়মেন্ট স্বয়ংক্রিয়ভাবে করা যায়।
- Automation: CI/CD পিপলাইন ব্যবহারের মাধ্যমে কোড ডেভেলপমেন্ট এবং ডিপ্লয়মেন্ট প্রক্রিয়া সহজ, দ্রুত এবং নিরাপদ হয়।
Elixir তে Test Coverage এবং CI/CD Integration এর মাধ্যমে আপনি কোডের গুণমান নিশ্চিত করতে এবং একটি উচ্চমানের সিস্টেম তৈরি করতে পারবেন।
Read more