RSpec-এ Shared Examples এবং Shared Contexts দুটি শক্তিশালী বৈশিষ্ট্য, যা কোডের পুনঃব্যবহারযোগ্যতা এবং পরীক্ষাগুলোর সংগঠন সহজ করে তোলে। এগুলি বিশেষভাবে উপকারী যখন আপনি একাধিক টেস্টে একই আচরণ বা কনফিগারেশন পুনঃব্যবহার করতে চান।
১. Shared Examples
Shared Examples ব্যবহার করা হয় একই ধরনের টেস্টগুলি একাধিক ফিচার বা কনটেক্সটে ভাগ করে নেয়ার জন্য। এটি মূলত এক বা একাধিক it ব্লকগুলোকে শেয়ার করতে দেয়। যদি আপনি একাধিক ফিচার বা ক্লাসের জন্য একই ধরনের টেস্ট প্রয়োগ করতে চান, তবে এটি অত্যন্ত কার্যকরী।
Shared Examples এর ব্যবহার:
- শেয়ার্ড এক্সাম্পলস তৈরি করুন:
# spec/shared_examples/validatable.rb
shared_examples "a valid email" do
it "is valid with a valid email" do
expect(user).to be_valid
end
it "is invalid without an email" do
expect(user).not_to be_valid
end
end- শেয়ার্ড এক্সাম্পল ব্যবহার করুন:
# spec/models/user_spec.rb
require 'shared_examples/validatable'
describe User do
let(:user) { User.new(email: "test@example.com") }
include_examples "a valid email" # এখানে Shared Example ব্যবহার করা হচ্ছে
end- আরেকটি কেসে ব্যবহার করুন:
# spec/models/admin_spec.rb
require 'shared_examples/validatable'
describe Admin do
let(:user) { Admin.new(email: "admin@example.com") }
include_examples "a valid email" # একই Shared Example আবার ব্যবহার করা হচ্ছে
endফলস্বরূপ, আপনি যদি একাধিক মডেল বা ক্লাসের জন্য একই ধরনের পরীক্ষা করতে চান, তাহলে একবারে একটি Shared Example তৈরি করে প্রতিটি ফিচারে তা শেয়ার করতে পারেন।
২. Shared Contexts
Shared Contexts রুবি প্রোগ্রামে সেই কনফিগারেশন বা সেটআপ ভাগ করে দেয়, যা একাধিক টেস্ট ব্লকে ব্যবহার করা হয়। এতে before এবং let বা অন্যান্য কনফিগারেশন লজিক অন্তর্ভুক্ত থাকতে পারে, যেগুলি একাধিক টেস্টে পুনঃব্যবহার করা যায়।
Shared Contexts এর ব্যবহার:
- শেয়ার্ড কনটেক্সট তৈরি করুন:
# spec/shared_contexts/user_setup.rb
RSpec.shared_context "with valid user", shared_context: :metadata do
let(:user) { User.new(email: "test@example.com") }
before do
user.save
end
end- শেয়ার্ড কনটেক্সট ব্যবহার করুন:
# spec/models/user_spec.rb
require 'shared_contexts/user_setup'
describe User do
include_context "with valid user" # Shared Context ব্যবহার করা হচ্ছে
it "is valid with a valid email" do
expect(user).to be_valid
end
end- আরেকটি কেসে ব্যবহার করুন:
# spec/controllers/users_controller_spec.rb
require 'shared_contexts/user_setup'
describe UsersController do
include_context "with valid user" # আবার Shared Context ব্যবহার করা হচ্ছে
it "should respond successfully" do
expect(response).to be_successful
end
endফলস্বরূপ, আপনি যেকোনো সংখ্যক টেস্টে বা ফিচারে পুনঃব্যবহারযোগ্য কনফিগারেশন ভাগ করতে পারেন, যেমন মক অবজেক্ট, সেটআপ, অথবা অন্যান্য যৌথ প্রস্তুতি।
Shared Examples এবং Shared Contexts এর মধ্যে পার্থক্য
- Shared Examples:
- ব্যবহার করা হয় টেস্টের আচরণ (বিহেভিয়ার) বা টেস্টের লজিক শেয়ার করতে।
- এটি বিশেষভাবে সেই সমস্ত টেস্টের জন্য উপকারী, যেখানে একই ধরনের পরীক্ষণ লজিক একাধিক ফিচারে প্রয়োজন।
- এটি শুধুমাত্র
itবাexampleব্লকগুলির মধ্যে ব্যবহৃত হয়।
- Shared Contexts:
- ব্যবহার করা হয় কনফিগারেশন বা পরিবেশ সেটআপ শেয়ার করতে।
- এটি
before,let, বা অন্যান্য কনফিগারেশন সম্পর্কিত লজিক শেয়ার করতে ব্যবহৃত হয়, যা একাধিক টেস্টে প্রযোজ্য। - এটি
before,let, এবং অন্যান্য টেস্ট প্রিপারেশন কোডে ব্যবহৃত হয়।
Shared Examples এবং Shared Contexts ব্যবহার করার সুবিধা
- কোড পুনঃব্যবহার: একাধিক টেস্টে একই কোড বা কনফিগারেশন শেয়ার করতে পারবেন, যা কোড রিপিটিশন কমায়।
- পাঠযোগ্যতা বৃদ্ধি: টেস্ট কোডের মধ্যে একাধিক অংশের পুনঃব্যবহার করা হলে কোড আরও পরিষ্কার ও সহজবোধ্য হয়।
- রক্ষণাবেক্ষণ সহজ: যেহেতু আপনি টেস্ট কোডের অনেক অংশ এক জায়গায় রাখছেন, তাই কোড আপডেট করার সময় সেগুলোর আপডেট করা সহজ হয়।
সারাংশ
RSpec-এ Shared Examples এবং Shared Contexts দুটি বৈশিষ্ট্য টেস্টিং প্রক্রিয়ায় পুনঃব্যবহারযোগ্যতা বৃদ্ধি করতে সহায়ক। Shared Examples টেস্টের আচরণ ভাগ করতে ব্যবহৃত হয়, এবং Shared Contexts টেস্টের কনফিগারেশন এবং প্রস্তুতি ভাগ করতে ব্যবহৃত হয়। এই দুটি বৈশিষ্ট্য ব্যবহারের মাধ্যমে কোডকে আরও সুশৃঙ্খল, রক্ষণাবেক্ষণযোগ্য এবং পাঠযোগ্য করা সম্ভব।
RSpec এ Shared Examples হলো একটি শক্তিশালী ফিচার, যা টেস্ট কোডের পুনরাবৃত্তি কমাতে সাহায্য করে। এটি আপনাকে একাধিক জায়গায় একই ধরনের টেস্ট শেয়ার বা পুনঃব্যবহার করার সুযোগ দেয়। এর মাধ্যমে আপনি একই লজিক বা আচরণের জন্য একবার টেস্ট লিখে তা বিভিন্ন জায়গায় ব্যবহার করতে পারেন, ফলে কোডের গঠন পরিষ্কার এবং রক্ষণাবেক্ষণ সহজ হয়।
Shared Examples এর ধারণা
Shared Examples RSpec-এ একটি কৌশল, যা বিশেষভাবে ডুপ্লিকেট টেস্ট কোড থেকে মুক্তি দিতে ব্যবহৃত হয়। যখন একই ধরনের টেস্ট একাধিক ক্লাস বা মডিউলের জন্য প্রয়োজন হয়, তখন shared examples ব্যবহার করা হয়। এটি একটি টেস্টের নির্দিষ্ট আচরণ বা বৈশিষ্ট্য নির্ধারণ করে এবং পরে এটি একাধিক জায়গায় ব্যবহার করা যায়।
উদাহরণ:
ধরা যাক, আপনার দুটি ক্লাস আছে, Car এবং Truck, যাদের মধ্যে কিছু সাধারণ আচরণ রয়েছে যেমন start এবং stop মেথড। আপনাকে দুটি ক্লাসের জন্য একই টেস্ট লেখার পরিবর্তে একটি শেয়ারড এক্সাম্পল তৈরি করা যাবে যা উভয় ক্লাসেই ব্যবহার করা যাবে।
Shared Examples ব্যবহার করার উপায়
Shared Examples তৈরি করা:
একটি শেয়ারড এক্সাম্পল তৈরি করতেshared_examplesব্লক ব্যবহার করা হয়। এর মধ্যে টেস্টের লজিক রাখা হয়।shared_examples "a vehicle" do it "should start" do expect(subject.start).to eq("Started") end it "should stop" do expect(subject.stop).to eq("Stopped") end endShared Examples ব্যবহার করা:
তারপর, আপনিit_behaves_likeবাit_should_behave_likeব্যবহার করে এই শেয়ারড এক্সাম্পলটি বিভিন্ন ক্লাসে ব্যবহার করতে পারেন।describe Car do subject { Car.new } it_behaves_like "a vehicle" end describe Truck do subject { Truck.new } it_behaves_like "a vehicle" end
এখানে, Car এবং Truck উভয়েই "a vehicle" শেয়ারড এক্সাম্পলটি ব্যবহার করছে। অর্থাৎ, উভয় ক্লাসের জন্য start এবং stop মেথডের জন্য একই টেস্ট রন্ন করবে।
Shared Examples এর প্রয়োজনীয়তা
- কোড পুনঃব্যবহার: যদি আপনি একাধিক ক্লাস বা মডিউলের জন্য এক ধরনের টেস্ট লিখতে চান, তবে Shared Examples ব্যবহারের মাধ্যমে একই টেস্ট একাধিক স্থানে পুনঃব্যবহার করা সহজ হয়। এটি ডুপ্লিকেট কোড থেকে মুক্তি দেয় এবং কোডের গঠন পরিষ্কার রাখে।
- রক্ষণাবেক্ষণ সহজ করা: যখন আপনার কোডে পরিবর্তন বা আপডেট করার প্রয়োজন হয়, তখন একবার আপডেট করলে, শেয়ারড এক্সাম্পল ব্যবহার করা টেস্ট কোডের পরিবর্তন সবার কাছে পৌঁছাতে সহজ করে দেয়।
- টেস্টের পুনঃব্যবহারযোগ্যতা: শেয়ারড এক্সাম্পল টেস্ট কোডের পুনঃব্যবহারযোগ্যতা বাড়ায়। আপনার যদি একাধিক বৈশিষ্ট্যের জন্য একই আচরণ পরীক্ষা করতে হয়, তবে আপনি একটি শেয়ারড এক্সাম্পল তৈরি করে সেটি বিভিন্ন পরিস্থিতিতে ব্যবহার করতে পারেন।
- কমপ্লেক্স সিস্টেমে সাদৃশ্য বজায় রাখা: যখন একাধিক ক্লাস বা মডিউল বা উপাদান একই আচরণ শেয়ার করে, তখন শেয়ারড এক্সাম্পল তাদের মধ্যে সাদৃশ্য বজায় রাখতে সহায়ক। এতে কোডের গুণগত মান এবং কোড কভারেজ বৃদ্ধি পায়।
সারাংশ
Shared Examples RSpec-এ এমন একটি ফিচার যা আপনাকে কোডের পুনঃব্যবহারযোগ্যতা বাড়াতে সাহায্য করে। এর মাধ্যমে একই ধরনের টেস্ট কোড একাধিক জায়গায় ব্যবহার করা যায়, ফলে কোডের গঠন পরিষ্কার, রক্ষণাবেক্ষণ সহজ এবং টেস্টের কার্যকারিতা বৃদ্ধি পায়। এটি বিশেষভাবে তখন ব্যবহার করা হয় যখন একাধিক ক্লাস বা মডিউলের মধ্যে একই ধরনের আচরণ বা বৈশিষ্ট্য পরীক্ষার প্রয়োজন হয়।
RSpec-এ Shared Contexts একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা আপনাকে একাধিক টেস্টে পুনঃব্যবহারযোগ্য সেটআপ (setup) এবং সহায়ক কোড শেয়ার করতে দেয়। এর মাধ্যমে টেস্ট কোডের পুনঃব্যবহারযোগ্যতা (test reusability) বাড়ানো যায় এবং কোডের ড্রাই (DRY - Don't Repeat Yourself) প্রিন্সিপল অনুসরণ করা সহজ হয়।
Shared Contexts ব্যবহার করে আপনি সাধারণ কোড বা সেটআপ অংশ একাধিক টেস্টে শেয়ার করতে পারেন, যা টেস্ট লিখতে সময় বাঁচায় এবং কোডকে পরিষ্কার রাখে।
Shared Context কী?
Shared Context হল এমন একটি ব্লক যেখানে আপনি সাধারণ সেটআপ এবং ডেটা ইনিশিয়ালাইজেশন কোড লিখতে পারেন যা একাধিক টেস্টে পুনঃব্যবহারযোগ্য। RSpec এ এটি shared_context ব্লক ব্যবহার করে তৈরি করা হয়।
Shared Context ব্যবহার করার উপকারিতা
- টেস্ট কোডের পুনঃব্যবহারযোগ্যতা বাড়ায়।
- একাধিক টেস্টের মধ্যে কমন সেটআপ, ইনিশিয়ালাইজেশন বা ভেরিয়েবল শেয়ার করতে সাহায্য করে।
- কোডের পুনরাবৃত্তি কমায় এবং কোড আরও পরিষ্কার এবং সহজে রক্ষণাবেক্ষণযোগ্য হয়।
- একাধিক টেস্টে সাধারণ লজিক রাখতে সাহায্য করে।
Shared Context এর ব্যবহার
ধরা যাক, আমরা একটি ইনভয়েস ম্যানেজমেন্ট সিস্টেম তৈরি করছি এবং আমাদের অনেক টেস্টে একই কাস্টমার ডেটা প্রয়োজন। Shared Context ব্যবহার করে আমরা একে শুধুমাত্র একবার লিখে সব টেস্টে ব্যবহার করতে পারব।
১. Shared Context তৈরি করা
প্রথমে, আমরা একটি shared_context তৈরি করি যেখানে সাধারণ সেটআপ কোড থাকবে:
# spec/support/shared_contexts.rb
RSpec.shared_context "customer setup" do
let(:customer) { Customer.create(name: "John Doe", email: "john@example.com") }
let(:invoice) { Invoice.create(customer: customer, amount: 100) }
endএখানে, আমরা customer এবং invoice অবজেক্ট তৈরি করেছি, যা একাধিক টেস্টে ব্যবহার করা হবে।
২. Shared Context ব্যবহার করা
এখন, আমরা আমাদের টেস্টে include_context ব্যবহার করে এই shared_context কে ইনক্লুড করব।
# spec/invoice_spec.rb
require 'rails_helper'
RSpec.describe Invoice, type: :model do
include_context "customer setup" # Shared context ব্যবহার
it "should belong to a customer" do
expect(invoice.customer).to eq(customer) # invoice-এর customer সঠিক কিনা পরীক্ষা
end
it "should have the correct amount" do
expect(invoice.amount).to eq(100) # invoice-এর amount সঠিক কিনা পরীক্ষা
end
endএখানে, আমরা include_context ব্যবহার করে customer setup কন্টেক্সটটি টেস্টে ইনক্লুড করেছি, যাতে customer এবং invoice ভেরিয়েবলগুলি টেস্টে স্বয়ংক্রিয়ভাবে উপলব্ধ হয়।
৩. আরেকটি টেস্ট ফাইলেও ব্যবহার
একই Shared Context আমরা অন্য একটি টেস্ট ফাইলে ব্যবহার করতে পারি:
# spec/order_spec.rb
require 'rails_helper'
RSpec.describe Order, type: :model do
include_context "customer setup" # Shared context ব্যবহার
it "should create an order for the customer" do
order = Order.create(customer: customer, total: 200)
expect(order.customer).to eq(customer) # order-এর customer সঠিক কিনা পরীক্ষা
expect(order.total).to eq(200) # order-এর total সঠিক কিনা পরীক্ষা
end
endএখানে, customer setup কন্টেক্সটটি অন্য একটি টেস্ট ফাইলেও ব্যবহার করা হয়েছে, এবং আমরা একই customer এবং invoice অবজেক্টগুলি আবার পুনরায় তৈরি না করে ব্যবহার করতে পারছি।
Advanced: Shared Examples
এছাড়াও, RSpec এ Shared Examples নামে একটি বৈশিষ্ট্যও আছে, যা আরও সাধারণ টেস্ট কাঠামো তৈরি করতে সহায়ক। উদাহরণস্বরূপ, যদি আপনি বিভিন্ন মডেল বা ক্লাসের জন্য একই ধরনের পরীক্ষা করতে চান, তবে Shared Examples ব্যবহার করতে পারেন।
# spec/support/shared_examples.rb
RSpec.shared_examples "a valid customer" do
it "has a valid name" do
expect(customer.name).to be_present
end
it "has a valid email" do
expect(customer.email).to match(/\A[^@\s]+@[^@\s]+\z/)
end
endএখন, এই শেয়ার্ড এক্সাম্পলটি বিভিন্ন টেস্ট ফাইলে ব্যবহার করা যাবে:
# spec/customer_spec.rb
require 'rails_helper'
RSpec.describe Customer, type: :model do
let(:customer) { Customer.create(name: "John Doe", email: "john@example.com") }
include_examples "a valid customer"
endএইভাবে, আপনি একাধিক টেস্টে কমন টেস্ট লজিক শেয়ার করতে পারেন এবং ডুপ্লিকেট কোড এড়াতে পারেন।
সারাংশ
Shared Context এর মাধ্যমে RSpec-এ কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি করা যায় এবং টেস্ট লেখা আরও সহজ এবং কার্যকর হয়। এটি একাধিক টেস্টে সাধারণ সেটআপ বা ডেটা শেয়ার করতে সাহায্য করে, এবং কোডের ড্রাই (DRY) প্রিন্সিপল অনুসরণে সহায়ক। এছাড়াও, Shared Examples এর মাধ্যমে বিভিন্ন ধরনের টেস্টে সাধারণ আচরণ পরীক্ষাও করা যায়।
RSpec এ Shared Resources ব্যবহার করা হয় যখন একাধিক টেস্টে একই ধরনের ডেটা বা অবজেক্ট বারবার ব্যবহার করতে হয়। এটি কোডকে পুনঃব্যবহারযোগ্য এবং সংগঠিত করে তোলে, এবং টেস্টিংকে আরও সহজ এবং দ্রুত করে তোলে। RSpec এ shared examples এবং shared contexts দুটি মূল উপায় রয়েছে যা আপনি complex test cases এর জন্য shared resources তৈরি করতে ব্যবহার করতে পারেন।
১. Shared Examples (শেয়ারড এক্সাম্পল)
Shared Examples ব্যবহৃত হয় যখন একই ধরনের টেস্ট একাধিক স্থানে পুনরায় ব্যবহার করতে হয়। এটি কোডের পুনঃব্যবহারযোগ্যতা এবং কার্যকারিতা বাড়াতে সাহায্য করে।
উদাহরণ:
ধরা যাক, আমাদের একটি অ্যাপ্লিকেশন রয়েছে যা ব্যবহারকারীর নাম যাচাই করে, এবং আমাদের এই টেস্টটি বিভিন্ন ক্ষেত্রে পুনরায় ব্যবহার করতে হবে।
# shared_examples.rb
RSpec.shared_examples "একটি বৈধ ব্যবহারকারীর নাম" do
it "ব্যবহারকারীর নাম অবশ্যই ৩ টি অক্ষরের বেশি হতে হবে" do
expect(user.name.length).to be > 3
end
it "ব্যবহারকারীর নাম সঠিকভাবে ফর্ম্যাট করা উচিত" do
expect(user.name).to match(/[A-Za-z]+/)
end
endএখন, এই শেয়ারড এক্সাম্পলটি আমরা বিভিন্ন টেস্টে ব্যবহার করতে পারি:
describe "ব্যবহারকারী A" do
let(:user) { User.new(name: "Alice") }
it_behaves_like "একটি বৈধ ব্যবহারকারীর নাম"
end
describe "ব্যবহারকারী B" do
let(:user) { User.new(name: "Bob") }
it_behaves_like "একটি বৈধ ব্যবহারকারীর নাম"
endএখানে, it_behaves_like ব্যবহার করে আমরা একই টেস্ট কোডকে বিভিন্ন বর্ণনায় ব্যবহার করেছি, যাতে একই আচরণ যাচাই করা যায়।
২. Shared Context (শেয়ারড কনটেক্সট)
Shared Context ব্যবহৃত হয় একাধিক টেস্টের জন্য একটি সাধারণ কনটেক্সট বা প্রস্তুতি ভাগ করতে। এটি ডাটাবেস সেটআপ, ফাইল ডাউনলোড, বা অন্যান্য প্রস্তুতিমূলক কাজের জন্য ব্যবহার করা হয়।
উদাহরণ:
ধরা যাক, আমাদের একটি কনটেক্সট রয়েছে যা কিছু ডেটাবেস বা অবজেক্ট প্রস্তুত করে যা একাধিক টেস্টে ব্যবহার করতে হবে।
# shared_contexts.rb
RSpec.shared_context "প্রাথমিক ডেটাবেস প্রস্তুতি" do
before do
@user = User.create(name: "Alice", email: "alice@example.com")
@product = Product.create(name: "Laptop", price: 1000)
end
endএখন, এই shared context-টি আমরা বিভিন্ন টেস্টে ব্যবহার করতে পারি:
describe "ব্যবহারকারী এবং পণ্য" do
include_context "প্রাথমিক ডেটাবেস প্রস্তুতি"
it "ব্যবহারকারী সঠিকভাবে নিবন্ধিত হয়েছে" do
expect(@user).to be_valid
end
it "পণ্য সঠিকভাবে যোগ করা হয়েছে" do
expect(@product).to be_valid
end
endএখানে, include_context ব্যবহার করে আমরা shared context কে বিভিন্ন টেস্টে যুক্ত করেছি, যার মাধ্যমে আমাদের ডেটাবেস বা প্রস্তুতির তথ্য শেয়ার করা হয়েছে।
Shared Resources এর সুবিধা
- কোড পুনঃব্যবহারযোগ্যতা: Shared Examples এবং Shared Context ব্যবহারের মাধ্যমে একই কোড বারবার না লিখে পুনরায় ব্যবহার করা যায়।
- সংগঠিত টেস্টিং: একাধিক টেস্টের জন্য এক ধরনের শেয়ারড রিসোর্স ব্যবহার করা টেস্টকে আরও সংগঠিত এবং পরিষ্কার করে তোলে।
- টেস্টের গতি বৃদ্ধি: shared resources ব্যবহার করার ফলে প্রতিটি টেস্টে একাধিকবার সেটআপ বা ডেটাবেস কাজ পুনরাবৃত্তি করতে হয় না, যা টেস্টিংয়ের গতি বৃদ্ধি করে।
- সহজ রক্ষণাবেক্ষণ: টেস্টের জন্য একাধিক রিসোর্স পরিবর্তন করতে হলে কেবল এক জায়গায় পরিবর্তন করা যায়, যা টেস্ট কোডের রক্ষণাবেক্ষণ সহজ করে তোলে।
সারাংশ
RSpec এ Shared Resources ব্যবহার করা হয় complex test cases এর জন্য পুনরায় ব্যবহৃত ডেটা বা অবজেক্টগুলোকে একত্রিত করতে। এটি shared examples এবং shared contexts ব্যবহারের মাধ্যমে টেস্টের কোড পুনঃব্যবহারযোগ্য, সংগঠিত এবং দ্রুত করতে সাহায্য করে। BDD এর এই পদ্ধতিটি সফটওয়্যার ডেভেলপমেন্টের টেস্টিং প্রক্রিয়া আরও সহজ, দ্রুত এবং কার্যকর করে তোলে।
RSpec এ Shared Resources ব্যবহৃত হয় যখন একাধিক টেস্টে একই ধরনের ডেটা বা অবজেক্ট বারবার ব্যবহার করতে হয়। এটি কোডকে পুনঃব্যবহারযোগ্য এবং সংগঠিত করে তোলে, এবং টেস্টিংকে আরও সহজ এবং দ্রুত করে তোলে। RSpec এ shared examples এবং shared contexts দুটি প্রধান উপায় রয়েছে যা আপনি complex test cases এর জন্য shared resources তৈরি করতে ব্যবহার করতে পারেন।
১. Shared Examples (শেয়ারড এক্সাম্পল)
Shared Examples ব্যবহৃত হয় যখন একই ধরনের টেস্ট একাধিক স্থানে পুনরায় ব্যবহার করতে হয়। এটি কোডের পুনঃব্যবহারযোগ্যতা এবং কার্যকারিতা বাড়াতে সাহায্য করে।
উদাহরণ:
ধরা যাক, আমাদের একটি অ্যাপ্লিকেশন রয়েছে যা ব্যবহারকারীর নাম যাচাই করে, এবং আমাদের এই টেস্টটি বিভিন্ন ক্ষেত্রে পুনরায় ব্যবহার করতে হবে।
# shared_examples.rb
RSpec.shared_examples "একটি বৈধ ব্যবহারকারীর নাম" do
it "ব্যবহারকারীর নাম অবশ্যই ৩ টি অক্ষরের বেশি হতে হবে" do
expect(user.name.length).to be > 3
end
it "ব্যবহারকারীর নাম সঠিকভাবে ফর্ম্যাট করা উচিত" do
expect(user.name).to match(/[A-Za-z]+/)
end
endএখন, এই শেয়ারড এক্সাম্পলটি আমরা বিভিন্ন টেস্টে ব্যবহার করতে পারি:
describe "ব্যবহারকারী A" do
let(:user) { User.new(name: "Alice") }
it_behaves_like "একটি বৈধ ব্যবহারকারীর নাম"
end
describe "ব্যবহারকারী B" do
let(:user) { User.new(name: "Bob") }
it_behaves_like "একটি বৈধ ব্যবহারকারীর নাম"
endএখানে, it_behaves_like ব্যবহার করে আমরা একই টেস্ট কোডকে বিভিন্ন বর্ণনায় ব্যবহার করেছি, যাতে একই আচরণ যাচাই করা যায়।
২. Shared Context (শেয়ারড কনটেক্সট)
Shared Context ব্যবহৃত হয় একাধিক টেস্টের জন্য একটি সাধারণ কনটেক্সট বা প্রস্তুতি ভাগ করতে। এটি ডাটাবেস সেটআপ, ফাইল ডাউনলোড, বা অন্যান্য প্রস্তুতিমূলক কাজের জন্য ব্যবহার করা হয়।
উদাহরণ:
ধরা যাক, আমাদের একটি কনটেক্সট রয়েছে যা কিছু ডেটাবেস বা অবজেক্ট প্রস্তুত করে যা একাধিক টেস্টে ব্যবহার করতে হবে।
# shared_contexts.rb
RSpec.shared_context "প্রাথমিক ডেটাবেস প্রস্তুতি" do
before do
@user = User.create(name: "Alice", email: "alice@example.com")
@product = Product.create(name: "Laptop", price: 1000)
end
endএখন, এই shared context-টি আমরা বিভিন্ন টেস্টে ব্যবহার করতে পারি:
describe "ব্যবহারকারী এবং পণ্য" do
include_context "প্রাথমিক ডেটাবেস প্রস্তুতি"
it "ব্যবহারকারী সঠিকভাবে নিবন্ধিত হয়েছে" do
expect(@user).to be_valid
end
it "পণ্য সঠিকভাবে যোগ করা হয়েছে" do
expect(@product).to be_valid
end
endএখানে, include_context ব্যবহার করে আমরা shared context কে বিভিন্ন টেস্টে যুক্ত করেছি, যার মাধ্যমে আমাদের ডেটাবেস বা প্রস্তুতির তথ্য শেয়ার করা হয়েছে।
Shared Resources এর সুবিধা
- কোড পুনঃব্যবহারযোগ্যতা: Shared Examples এবং Shared Context ব্যবহারের মাধ্যমে একই কোড বারবার না লিখে পুনরায় ব্যবহার করা যায়।
- সংগঠিত টেস্টিং: একাধিক টেস্টের জন্য এক ধরনের শেয়ারড রিসোর্স ব্যবহার করা টেস্টকে আরও সংগঠিত এবং পরিষ্কার করে তোলে।
- টেস্টের গতি বৃদ্ধি: shared resources ব্যবহার করার ফলে প্রতিটি টেস্টে একাধিকবার সেটআপ বা ডেটাবেস কাজ পুনরাবৃত্তি করতে হয় না, যা টেস্টিংয়ের গতি বৃদ্ধি করে।
- সহজ রক্ষণাবেক্ষণ: টেস্টের জন্য একাধিক রিসোর্স পরিবর্তন করতে হলে কেবল এক জায়গায় পরিবর্তন করা যায়, যা টেস্ট কোডের রক্ষণাবেক্ষণ সহজ করে তোলে।
৩. Shared Context এর ব্যবহারের সেরা প্র্যাকটিস
- শেয়ারড কনটেক্সট শুধুমাত্র সাধারণ প্রস্তুতির জন্য ব্যবহার করুন:
শেয়ারড কনটেক্সট ব্যবহার করার মূল উদ্দেশ্য হলো সাধারণ প্রস্তুতি ভাগ করা, যেমন ডেটাবেস রেকর্ড তৈরি বা ফাইল সেটআপ। এটি কোডকে সংগঠিত রাখতে সাহায্য করে। - সাম্প্রতিক টেস্টগুলি সহজে বুঝতে হবে:
শেয়ারড কনটেক্সট এবং শেয়ারড এক্সাম্পল ব্যবহারের সময় কোডের পাঠযোগ্যতা বজায় রাখা উচিত। কোডের মধ্যে কোথায় কী করা হচ্ছে তা যেন পরবর্তী সময়ে সহজে বোঝা যায়। - শেয়ারড কনটেক্সট ছোট এবং একক কাজের জন্য রাখুন:
কনটেক্সটগুলো ছোট এবং ফোকাসড রাখা উচিত। একাধিক কাজ একসঙ্গে রাখলে পরবর্তীতে সেটি অশুদ্ধ বা অস্পষ্ট হতে পারে।
৪. Shared Examples এর ব্যবহার
শেয়ারড এক্সাম্পল ব্যবহারের মাধ্যমে আপনি যদি একাধিক টেস্টে একই ধরনের আচরণ যাচাই করতে চান, তাহলে shared_examples ব্যবহার করা যায়।
উদাহরণ:
RSpec.shared_examples "একটি বৈধ মডেল" do
it "সঠিকভাবে তৈরি হবে" do
expect(model).to be_valid
end
it "নাম থাকতে হবে" do
model.name = nil
expect(model).to be_invalid
end
end
RSpec.describe User do
it_behaves_like "একটি বৈধ মডেল" do
let(:model) { User.new(name: "John") }
end
end
RSpec.describe Product do
it_behaves_like "একটি বৈধ মডেল" do
let(:model) { Product.new(name: "Laptop") }
end
endএখানে it_behaves_like ব্যবহার করা হয়েছে যাতে একাধিক মডেলের জন্য একই রকম টেস্ট করা যায়।
সারাংশ
Shared Resources বা Shared Context ব্যবহৃত হয় complex test cases এর জন্য কোড পুনঃব্যবহারযোগ্য এবং সংগঠিত করতে। RSpec এ shared examples এবং shared contexts টেস্টের কোড কমিয়ে সহজ, দ্রুত, এবং বেশি রক্ষণাবেক্ষণযোগ্য করে তোলে। তবে, সেগুলি ব্যবহার করার সময় সতর্ক থাকা উচিত যাতে কোড অতিরিক্ত জটিল না হয়ে পড়ে এবং টেস্টগুলির পাঠযোগ্যতা বজায় থাকে।
Read more