RSpec হলো রুবি প্রোগ্রামিং ভাষার জন্য একটি শক্তিশালী টেস্টিং ফ্রেমওয়ার্ক এবং Ruby on Rails অ্যাপ্লিকেশন তৈরি করার জন্য এটি একটি জনপ্রিয় টেস্টিং টুল। RSpec এবং Rails একত্রে ব্যবহৃত হলে ডেভেলপাররা তাদের অ্যাপ্লিকেশনগুলোর কোডের ব্যবহারযোগ্যতা এবং বিশ্বাসযোগ্যতা পরীক্ষা করতে পারেন। এটি Test-Driven Development (TDD) এবং Behavior-Driven Development (BDD) পদ্ধতির জন্য আদর্শ।
RSpec ইনস্টলেশন এবং সেটআপ
১. Gemfile তে RSpec যুক্ত করা
Rails অ্যাপ্লিকেশনে RSpec ব্যবহার করতে প্রথমে আপনাকে আপনার Gemfile ফাইলে RSpec এর রিলেটেড জেমগুলো যোগ করতে হবে।
# Gemfile
group :development, :test do
gem 'rspec-rails'
gem 'factory_bot_rails' # factory_bot for creating test data
gem 'faker' # Fake data generation
endএরপর bundle install চালিয়ে Gemfile-এ উল্লেখিত সমস্ত জেম ইনস্টল করুন:
bundle install২. RSpec ইনিশিয়ালাইজ করা
RSpec Rails সেটআপ করতে নিচের কমান্ডটি চালান:
rails generate rspec:installএটি দুটি ফাইল তৈরি করবে:
- spec/spec_helper.rb: এখানে সাধারণ কনফিগারেশন সেট করা হয়।
- spec/rails_helper.rb: এটি রেলস স্পেসিফিক কনফিগারেশন ধারণ করে।
এছাড়া spec ডিরেক্টরি তৈরি হবে যেখানে সমস্ত টেস্ট ফাইল থাকবে।
RSpec এর সাথে Rails এর মডেল টেস্টিং
Rails অ্যাপ্লিকেশনে RSpec এর মাধ্যমে মডেল, কন্ট্রোলার, ভিউ এবং রাউটারসহ অন্যান্য উপাদান পরীক্ষা করা যায়। মডেল টেস্টিং একটি গুরুত্বপূর্ণ অংশ, কারণ এটি ডেটাবেস এবং লজিক্যাল অপারেশনের সাথে সম্পর্কিত।
উদাহরণ: মডেল টেস্টিং
ধরা যাক, আমাদের একটি User মডেল আছে, যেটি ইমেইল এবং পাসওয়ার্ড সহ একটি ব্যবহারকারী তৈরি করে।
# app/models/user.rb
class User < ApplicationRecord
validates :email, presence: true, uniqueness: true
validates :password, presence: true
endএখন এই মডেলটির জন্য RSpec টেস্ট লেখি:
# spec/models/user_spec.rb
require 'rails_helper'
RSpec.describe User, type: :model do
it "is valid with valid attributes" do
user = User.new(email: "test@example.com", password: "password")
expect(user).to be_valid
end
it "is invalid without an email" do
user = User.new(password: "password")
expect(user).to_not be_valid
end
it "is invalid with a duplicate email" do
User.create(email: "test@example.com", password: "password")
user = User.new(email: "test@example.com", password: "password")
expect(user).to_not be_valid
end
endএখানে, আমরা তিনটি টেস্ট তৈরি করেছি:
- ভ্যালিড ব্যবহারকারী: যে ব্যবহারকারী সঠিক ইমেইল এবং পাসওয়ার্ড সহ তৈরি করা হয়েছে।
- ইমেইল ছাড়া: যাদের ইমেইল না থাকলে তারা বৈধ নয়।
- ডুপ্লিকেট ইমেইল: যেখানে একটি ডুপ্লিকেট ইমেইল সঠিক নয়।
টেস্ট রান:
rspec spec/models/user_spec.rbRSpec এবং কন্ট্রোলার টেস্টিং
Rails কন্ট্রোলার টেস্টিং RSpec দিয়ে করা যায় যা বিভিন্ন অ্যাকশন বা রাউটারের ফলাফল পরীক্ষা করে।
উদাহরণ: কন্ট্রোলার টেস্টিং
ধরা যাক, আমাদের একটি UsersController রয়েছে যা সমস্ত ব্যবহারকারীর তথ্য প্রদর্শন করবে।
# app/controllers/users_controller.rb
class UsersController < ApplicationController
def index
@users = User.all
end
endএখন, এই কন্ট্রোলারের জন্য একটি RSpec টেস্ট লেখি:
# spec/controllers/users_controller_spec.rb
require 'rails_helper'
RSpec.describe UsersController, type: :controller do
describe "GET #index" do
it "returns a successful response" do
get :index
expect(response).to be_successful
end
it "assigns @users" do
user = User.create(email: "test@example.com", password: "password")
get :index
expect(assigns(:users)).to eq([user])
end
end
endএখানে:
- GET #index: কন্ট্রোলারের
indexঅ্যাকশন টেস্ট করেছি যা ব্যবহারকারীদের লিস্ট ফিরিয়ে দেয়। - প্রত্যুত্তর যাচাই: টেস্ট করেছি যে
GETরিকোয়েস্ট সফল হয়েছে কিনা। - @users অ্যাসাইনমেন্ট যাচাই: টেস্ট করেছি যে
@usersঅ্যাসাইনমেন্ট সঠিকভাবে কাজ করছে কিনা।
টেস্ট রান:
rspec spec/controllers/users_controller_spec.rbRSpec এবং ভিউ টেস্টিং
Rails অ্যাপ্লিকেশনে, আপনি RSpec এর মাধ্যমে ভিউগুলোর আচরণ পরীক্ষা করতে পারেন। তবে, সাধারণভাবে ভিউ টেস্টিং কম করা হয়, কারণ এটি অনেক সময় রেন্ডারিং লজিকের বাইরে চলে যায়। তবে, যখন দরকার পড়ে, তখন RSpec ব্যবহার করে ভিউ টেস্ট করা সম্ভব।
সারাংশ
- RSpec হল Rails অ্যাপ্লিকেশনে বিহেভিয়ার ড্রিভেন ডেভেলপমেন্ট (BDD) পদ্ধতির মাধ্যমে কোড টেস্টিং করার জন্য ব্যবহৃত একটি শক্তিশালী টুল।
- RSpec-rails গেম ব্যবহার করে Rails অ্যাপ্লিকেশন সহজে টেস্ট করা যায়, এবং আপনি মডেল, কন্ট্রোলার, ভিউ, এবং রাউটার টেস্টিংসহ বিভিন্ন কার্যক্রম পরীক্ষা করতে পারেন।
- RSpec টেস্ট লেখার মাধ্যমে আপনি আপনার কোডের বিশ্বাসযোগ্যতা এবং প্রত্যাশিত আচরণ নিশ্চিত করতে পারেন।
RSpec এবং Rails একত্রে ব্যবহৃত হলে আপনার অ্যাপ্লিকেশনের কোডের গুণগত মান বজায় রাখা সহজ হয়ে যায় এবং টেস্ট ড্রিভেন ডেভেলপমেন্ট (TDD) ও বিহেভিয়ার ড্রিভেন ডেভেলপমেন্ট (BDD) পদ্ধতির সাহায্যে কোড লেখার গতি বৃদ্ধি পায়।
Rails অ্যাপ্লিকেশনে RSpec ব্যবহার করে Integration Testing করতে, আমরা বিভিন্ন অ্যাকশন এবং ভিউ-এর মধ্যে ইন্টিগ্রেশন পরীক্ষা করি। এটি নিশ্চিত করতে সাহায্য করে যে অ্যাপ্লিকেশনের সমস্ত উপাদান (যেমন মডেল, কন্ট্রোলার, ভিউ, রাউটিং ইত্যাদি) একে অপরের সঙ্গে সঠিকভাবে কাজ করছে। রেলসে RSpec ইন্টিগ্রেশন টেস্ট সাধারণত কন্ট্রোলার টেস্টিং, ফিচার টেস্টিং, এবং API টেস্টিং হিসেবে বিভক্ত করা হয়।
১. Rails এ RSpec Setup
RSpec ইন্সটলেশন
প্রথমে, আপনার রেলস প্রজেক্টে RSpec ইন্সটল করতে হবে। এই কাজটি করতে নিচের পদক্ষেপগুলি অনুসরণ করুন:
RSpec gem ইনস্টল করুন:
# Gemfile group :development, :test do gem 'rspec-rails' endBundle Install করুন:
bundle installRSpec ইনিশিয়ালাইজ করুন:
rails generate rspec:install
এই কমান্ডটি .rspec এবং spec ফোল্ডার তৈরি করবে।
২. Integration Testing এর ধারণা
Integration Testing এমন একটি প্রক্রিয়া, যেখানে আমরা অ্যাপ্লিকেশনের বিভিন্ন অংশের মধ্যে ইন্টিগ্রেশন যাচাই করি। এটি অ্যাপ্লিকেশনটির ভেতরের অংশগুলো কিভাবে একসাথে কাজ করে তার একটি পূর্ণাঙ্গ পরীক্ষা।
Rails এ Integration Test করার জন্য RSpec সাধারণত ফিচার টেস্টিং (Feature Testing) পদ্ধতি ব্যবহার করে, যেখানে আপনি বিভিন্ন HTTP রিকোয়েস্ট, রাউটিং, কন্ট্রোলার অ্যাকশন এবং ভিউ রেন্ডারিং একসাথে পরীক্ষা করতে পারেন।
৩. ফিচার টেস্টিং (Feature Testing)
ফিচার টেস্টিং হলো RSpec এর একটি পদ্ধতি যেখানে পুরো সিস্টেমের বিভিন্ন অংশের মধ্যে ইন্টিগ্রেশন পরীক্ষিত হয়। এটি এমন টেস্ট যা পুরো অ্যাপ্লিকেশন বা নির্দিষ্ট ফিচারের কার্যকারিতা পরীক্ষা করে।
RSpec এর feature এবং scenario ব্যবহার
Rails এ ফিচার টেস্ট তৈরি করতে feature এবং scenario ব্লক ব্যবহার করা হয়।
উদাহরণ:
ধরা যাক, আমরা একটি সাইন-ইন ফিচার টেস্ট করতে চাই:
# spec/features/user_sign_in_spec.rb
require 'rails_helper'
feature 'User signs in' do
scenario 'with valid credentials' do
user = FactoryBot.create(:user, email: 'test@example.com', password: 'password')
visit new_user_session_path
fill_in 'Email', with: 'test@example.com'
fill_in 'Password', with: 'password'
click_button 'Log in'
expect(page).to have_content('Signed in successfully')
end
scenario 'with invalid credentials' do
visit new_user_session_path
fill_in 'Email', with: 'wrong@example.com'
fill_in 'Password', with: 'wrongpassword'
click_button 'Log in'
expect(page).to have_content('Invalid Email or password')
end
endএই উদাহরণে:
featureব্লকটি একটি নির্দিষ্ট ফিচার বা ফাংশনালিটি বর্ণনা করে।scenarioব্লকটি বিশেষ একটি টেস্টের ক্ষেত্রে আচরণ বর্ণনা করে।visitদিয়ে আমরা সাইন-ইন পেজে যাই, তারপরfill_inদিয়ে ইনপুট ফিল্ডে ডেটা প্রবেশ করি এবংclick_buttonদিয়ে সাবমিট করি।expect(page)দিয়ে আমরা নিশ্চিত করি যে, সঠিক সাইন-ইন ম্যাসেজ পেজে প্রদর্শিত হচ্ছে।
৪. ফিচার টেস্টে বিভিন্ন কনফিগারেশন
কাস্টম ডেটা এবং মডেল ব্যবহার
অনেক সময় আমাদের ফিচার টেস্টে রেলসের মডেল বা ডাটাবেসের ডেটা ব্যবহার করতে হয়। এই ডেটা তৈরি করতে আমরা সাধারণত FactoryBot ব্যবহার করি। FactoryBot আমাদের জন্য পপুলেশন ডেটা তৈরি করতে সহায়ক। উদাহরণ:
# spec/factories/users.rb
FactoryBot.define do
factory :user do
email { 'test@example.com' }
password { 'password' }
end
endএখন আপনি FactoryBot.create(:user) ব্যবহার করে নতুন ব্যবহারকারী তৈরি করতে পারেন, যা পরীক্ষার জন্য ডেটা প্রদান করবে।
Capybara Integration
Capybara হল একটি টুল যা ওয়েব পেজের ইন্টারঅ্যাকশনের জন্য ব্যবহৃত হয় এবং রেলস অ্যাপ্লিকেশনের ফিচার টেস্টিংয়ের জন্য আদর্শ। এটি visit, click_button, fill_in এর মতো বিভিন্ন ফাংশনality প্রদান করে যা ব্রাউজারের মাধ্যমে ওয়েব পেজে কাজ করতে সহায়তা করে।
৫. API Testing with RSpec
API টেস্টিং করার জন্য, আপনি request স্পেসিফায়ার ব্যবহার করে রেলসের API-গুলোর টেস্ট করতে পারেন।
উদাহরণ:
# spec/requests/users_spec.rb
require 'rails_helper'
RSpec.describe "Users API", type: :request do
let(:valid_attributes) { { name: "John", email: "john@example.com" } }
let(:invalid_attributes) { { name: nil, email: "invalid@example.com" } }
describe "POST /users" do
it "creates a new user" do
post "/users", params: { user: valid_attributes }
expect(response).to have_http_status(:created)
end
it "does not create a new user with invalid attributes" do
post "/users", params: { user: invalid_attributes }
expect(response).to have_http_status(:unprocessable_entity)
end
end
endএখানে আমরা একটি API রিকোয়েস্টের মাধ্যমে POST মেথডের টেস্ট করছি, যেখানে সঠিক এবং ভুল ডেটা পাঠানো হচ্ছে এবং সেগুলির প্রতিক্রিয়া যাচাই করা হচ্ছে।
সারাংশ
Rails-এ RSpec এর মাধ্যমে Integration Testing সাধারণত ফিচার টেস্টিং বা API টেস্টিং হিসেবে করা হয়। এই টেস্টিং পদ্ধতিতে, বিভিন্ন অ্যাপ্লিকেশন উপাদান যেমন কন্ট্রোলার, রাউটিং, ভিউ ইত্যাদি একত্রে পরীক্ষা করা হয়। RSpec, Capybara, এবং FactoryBot ব্যবহার করে আপনি পুরো অ্যাপ্লিকেশনের ইন্টিগ্রেশন পরীক্ষা করতে পারেন এবং নিশ্চিত করতে পারেন যে সমস্ত ফিচার একে অপরের সাথে সঠিকভাবে কাজ করছে।
RSpec এর মাধ্যমে Model, Controller, এবং View এর জন্য টেস্ট লেখা একটি গুরুত্বপূর্ণ পদ্ধতি যাতে অ্যাপ্লিকেশনের প্রত্যেকটি অংশ সঠিকভাবে কাজ করছে কিনা তা যাচাই করা যায়। এর মাধ্যমে আপনি নিশ্চিত হতে পারেন যে আপনার অ্যাপ্লিকেশনটি প্রত্যাশিতভাবে আচরণ করছে এবং কোডের কোনো ত্রুটি বা বাগ আছে কিনা।
Model এর জন্য Test লেখা
Model টেস্ট করার মাধ্যমে আপনি আপনার ডেটাবেস লজিক এবং বিজনেস রুলস পরীক্ষা করেন। সাধারণত, আপনি ActiveRecord মডেলগুলির ভ্যালিডেশন, অ্যাসোসিয়েশন এবং কাস্টম মেথড টেস্ট করবেন।
উদাহরণ:
# app/models/user.rb
class User < ApplicationRecord
validates :name, presence: true
validates :email, presence: true, uniqueness: true
def full_name
"#{first_name} #{last_name}"
end
endModel Test:
# spec/models/user_spec.rb
require 'rails_helper'
RSpec.describe User, type: :model do
it "is valid with valid attributes" do
user = User.new(name: "John Doe", email: "john.doe@example.com")
expect(user).to be_valid
end
it "is not valid without a name" do
user = User.new(name: nil, email: "john.doe@example.com")
expect(user).not_to be_valid
end
it "is not valid without an email" do
user = User.new(name: "John Doe", email: nil)
expect(user).not_to be_valid
end
it "returns the correct full name" do
user = User.new(first_name: "John", last_name: "Doe")
expect(user.full_name).to eq("John Doe")
end
endএখানে:
- ব্যালিডেশন টেস্ট:
nameএবংemailফিল্ডসের জন্য টেস্ট করা হচ্ছে। - কাস্টম মেথড টেস্ট:
full_nameমেথডটির কার্যকারিতা যাচাই করা হচ্ছে।
Controller এর জন্য Test লেখা
Controller টেস্ট করার মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনের অ্যাকশন এবং রেসপন্স পরীক্ষা করেন। এটি নিশ্চিত করতে সহায়ক যে একটি অ্যাকশন সঠিক রেসপন্স প্রদান করছে এবং সঠিক ভিউ বা রিডিরেক্ট পাচ্ছে।
উদাহরণ:
# app/controllers/users_controller.rb
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
end
endController Test:
# spec/controllers/users_controller_spec.rb
require 'rails_helper'
RSpec.describe UsersController, type: :controller do
let(:user) { create(:user) }
describe "GET #show" do
it "returns a successful response" do
get :show, params: { id: user.id }
expect(response).to be_successful
end
it "assigns the correct user to @user" do
get :show, params: { id: user.id }
expect(assigns(:user)).to eq(user)
end
it "renders the show template" do
get :show, params: { id: user.id }
expect(response).to render_template(:show)
end
end
endএখানে:
- GET রিকোয়েস্ট টেস্ট:
showঅ্যাকশনটি সঠিকভাবে কাজ করছে কিনা এবং@userভেরিয়েবলটি সঠিকভাবে অ্যাসাইন হচ্ছে কিনা যাচাই করা হয়েছে। - রেসপন্স টেস্ট: রেসপন্স সফল কিনা এবং সঠিক ভিউ রেন্ডার হচ্ছে কিনা পরীক্ষা করা হয়েছে।
View এর জন্য Test লেখা
View টেস্ট করার মাধ্যমে আপনি নিশ্চিত করতে পারেন যে আপনার ভিউ সঠিকভাবে রেন্ডার হচ্ছে এবং সঠিক ডাটা প্রদর্শন করছে। সাধারণত, view rendering, helper methods এবং partials পরীক্ষা করা হয়।
উদাহরণ:
# app/views/users/show.html.erb
<h1><%= @user.full_name %></h1>View Test:
# spec/views/users/show.html.erb_spec.rb
require 'rails_helper'
RSpec.describe "users/show.html.erb", type: :view do
let(:user) { create(:user, first_name: "John", last_name: "Doe") }
it "displays the user's full name" do
assign(:user, user)
render
expect(rendered).to include("John Doe")
end
endএখানে:
- Render টেস্ট:
@user.full_nameসঠিকভাবে প্রদর্শিত হচ্ছে কিনা যাচাই করা হয়েছে।
Controller, Model এবং View এর জন্য Test এর গুরুত্ব
- Model Testing: আপনার ডেটা এবং বিজনেস লজিক সঠিকভাবে কাজ করছে কিনা যাচাই করা।
- Controller Testing: অ্যাকশনগুলো সঠিকভাবে কাজ করছে কিনা এবং সঠিক রেসপন্স বা ভিউ রেন্ডার করছে কিনা পরীক্ষা করা।
- View Testing: UI লেয়ারের সঠিক রেন্ডারিং এবং ডাটা প্রদর্শন নিশ্চিত করা।
সারাংশ
- Model Test: মডেল লজিক, ভ্যালিডেশন এবং মেথড পরীক্ষার জন্য ব্যবহৃত হয়।
- Controller Test: অ্যাকশনগুলির রেসপন্স এবং ভিউ রেন্ডারিং পরীক্ষার জন্য ব্যবহৃত হয়।
- View Test: ভিউ লেয়ারের সঠিক প্রদর্শন এবং ডাটা পরীক্ষার জন্য ব্যবহৃত হয়।
RSpec ব্যবহারে আপনি আপনার অ্যাপ্লিকেশনের প্রতিটি অংশকে নির্ভরযোগ্যভাবে পরীক্ষা করতে পারেন, যার ফলে কোডের উন্নতি এবং বাগ কমানোর সম্ভাবনা বেড়ে যায়।
RSpec এ Request Specs এবং Feature Specs দুটি গুরুত্বপূর্ণ টেস্টিং কৌশল যা ওয়েব অ্যাপ্লিকেশনের বিভিন্ন দিক পরীক্ষা করতে ব্যবহৃত হয়। এই স্পেসিফিকেশনগুলি API টেস্টিং এবং ইউজার ইন্টারফেস টেস্টিং করার জন্য ব্যবহৃত হয় এবং RSpec এর মাধ্যমে পুরো অ্যাপ্লিকেশনটি কার্যকরভাবে পরীক্ষা করা যায়। এগুলোর মূল উদ্দেশ্য হলো ব্যবহারকারীর দৃষ্টিকোণ থেকে অ্যাপ্লিকেশনের আচরণ পরীক্ষা করা।
১. Request Specs
Request Specs ওয়েব অ্যাপ্লিকেশনের HTTP রিকোয়েস্ট এবং Response যাচাই করার জন্য ব্যবহৃত হয়। এই স্পেসিফিকেশনগুলি সাধারণত API বা রুট পর্যায়ে পরীক্ষার জন্য ব্যবহৃত হয়। এতে অ্যাপ্লিকেশনের কন্ট্রোলার রিকোয়েস্ট এবং রেসপন্সের পরীক্ষা করা হয়, যেমন GET, POST, PUT, DELETE রিকোয়েস্টের মাধ্যমে ডেটা আপডেট বা প্রাপ্তি।
Request Specs এর উদ্দেশ্য:
- HTTP রিকোয়েস্ট এবং রেসপন্স যাচাই করা।
- কন্ট্রোলারের কাজ ও রেসপন্সের সঠিকতা নিশ্চিত করা।
- রুট এবং কন্ট্রোলার ইন্টারঅ্যাকশন পরীক্ষা করা।
Sintax:
RSpec.describe "Example Request", type: :request do
describe "GET /example" do
it "সঠিক রেসপন্স কোড প্রদান করে" do
get "/example"
expect(response).to have_http_status(200)
end
end
endউদাহরণ:
RSpec.describe "Users API", type: :request do
describe "GET /users" do
it "সকল ইউজারকে তালিকা প্রদান করবে" do
get "/users"
expect(response).to have_http_status(200)
expect(response.body).to include("John")
end
end
endএখানে:
get "/users": এটি GET রিকোয়েস্ট পাঠাচ্ছে "/users" রুটে।expect(response).to have_http_status(200): এটি পরীক্ষার মাধ্যমে রেসপন্স কোড 200 (OK) হবে কিনা যাচাই করছে।expect(response.body).to include("John"): এটি রেসপন্সের মধ্যে "John" নামটি অন্তর্ভুক্ত থাকবে কিনা যাচাই করছে।
২. Feature Specs
Feature Specs বা Integration Specs পুরো অ্যাপ্লিকেশনের ফিচারের ওপর পরীক্ষা চালানোর জন্য ব্যবহৃত হয়। এই স্পেসিফিকেশনগুলি ইউজারের পৃথক ক্রিয়া বা ফিচারগুলির মধ্যে ইন্টিগ্রেশন পরীক্ষা করে, অর্থাৎ কিভাবে বিভিন্ন উপাদান একত্রে কাজ করে তা যাচাই করা। সাধারণত Cucumber বা Capybara এর মত টুল ব্যবহার করে ইউজার ইন্টারফেসের উপর পরীক্ষা করা হয়, যেখানে রিয়েল টাইম ইন্টারঅ্যাকশন বা ব্রাউজার ইন্টারফেসের মধ্য দিয়ে একটি ফিচার পরীক্ষা করা হয়।
Feature Specs এর উদ্দেশ্য:
- অ্যাপ্লিকেশনের ইউজার ইন্টারফেসের আচরণ পরীক্ষা করা।
- একাধিক মডিউল বা উপাদান একত্রে কাজ করছে কিনা যাচাই করা।
- ব্যবহারকারীর সাথে ইন্টারঅ্যাকশন পরীক্ষার জন্য ওয়েব পেজ বা ইউজার ইন্টারফেস ব্যবহার করা।
Sintax:
RSpec.describe "Users", type: :feature do
scenario "একটি নতুন ইউজার নিবন্ধন করতে চায়" do
visit "/users/new"
fill_in "Name", with: "John"
fill_in "Email", with: "john@example.com"
click_button "Sign Up"
expect(page).to have_content("Welcome, John!")
end
endউদাহরণ:
RSpec.describe "Login Process", type: :feature do
scenario "একটি সঠিক ইউজার নাম এবং পাসওয়ার্ড দিয়ে লগ ইন করা" do
visit "/login"
fill_in "Username", with: "john_doe"
fill_in "Password", with: "password123"
click_button "Log In"
expect(page).to have_content("Welcome back, john_doe!")
end
endএখানে:
visit "/login": এটি পেজে নেভিগেট করে (জैसे ব্রাউজারে/loginপেজে যাওয়া)।fill_in "Username", with: "john_doe": এটি ইউজারনেম ইনপুট ফিল্ডে মান প্রদান করে।click_button "Log In": এটি লগ ইন বাটনে ক্লিক করে।expect(page).to have_content("Welcome back, john_doe!"): এটি পরীক্ষার মাধ্যমে যাচাই করছে যে, পেজে "Welcome back, john_doe!" বার্তা আছে কিনা।
Request Specs এবং Feature Specs এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | Request Specs | Feature Specs |
|---|---|---|
| পরীক্ষার স্তর | API বা HTTP রিকোয়েস্ট পর্যায়ে পরীক্ষা করা হয় | ইউজার ইন্টারফেস বা ফিচার পর্যায়ে পরীক্ষা করা হয় |
| ব্যবহার | কন্ট্রোলার, রুট এবং HTTP রিকোয়েস্ট পরীক্ষার জন্য | পুরো সিস্টেম বা ফিচার ইন্টিগ্রেশন পরীক্ষা করতে |
| ফোকাস | HTTP রিকোয়েস্ট এবং রেসপন্সের সঠিকতা | ইউজারের কার্যক্রম, ইন্টারঅ্যাকশন এবং পেজের ফিচার |
| ইনফ্রাস্ট্রাকচার | HTTP রিকোয়েস্টের মাধ্যমে অ্যাপ্লিকেশন লজিক পরীক্ষা | UI এর মাধ্যমে বিভিন্ন ফিচারের ইন্টিগ্রেশন পরীক্ষা |
সারাংশ
- Request Specs ব্যবহার করে আপনি HTTP রিকোয়েস্ট এবং রেসপন্সের সাথে সম্পর্কিত টেস্ট লিখতে পারেন, যেমন API টেস্টিং বা কন্ট্রোলারের কার্যকারিতা যাচাই করা।
- Feature Specs পুরো ফিচার বা ইউজারের ইন্টারঅ্যাকশন পরীক্ষা করার জন্য ব্যবহার করা হয়, যা অ্যাপ্লিকেশনের UI এবং ইন্টিগ্রেশন পরীক্ষা করে।
এই দুটি স্পেসিফিকেশন কৌশল ব্যবহার করে আপনার ওয়েব অ্যাপ্লিকেশন বা API-র আচরণ এবং কার্যকারিতা উন্নতভাবে যাচাই করা সম্ভব।
RSpec-এ Rails Specific Matchers হলো এমন Matchers যা বিশেষভাবে Ruby on Rails অ্যাপ্লিকেশন টেস্টিংয়ের জন্য তৈরি। এগুলি Rails-এর বিভিন্ন ফিচার এবং ফাংশনালিটিকে টেস্ট করার জন্য উপযুক্ত, যেমন ডাটাবেস সম্পর্কিত যাচাই, রাউটিং পরীক্ষা, মডেল ভ্যালিডেশন পরীক্ষা, এবং আরও অনেক কিছু। এই Matchers গুলি Rails-এর বিল্ট-ইন ফাংশনালিটিগুলির সাথে সামঞ্জস্যপূর্ণ এবং আরও কার্যকর টেস্টিং সহজ করে তোলে।
Rails Specific Matchers-এ কিছু জনপ্রিয় Matchers ব্যবহার করা হয়েছে। নিচে কিছু সাধারণ এবং গুরুত্বপূর্ণ Matchers-এর বর্ণনা দেওয়া হলো:
১. expect(response).to render_template
এটি ব্যবহার করা হয় কন্ট্রোলার রেসপন্সের টেমপ্লেট যাচাই করতে। এটি নিশ্চিত করে যে কন্ট্রোলারের একশন একটি নির্দিষ্ট টেমপ্লেট রেন্ডার করেছে।
উদাহরণ:
describe ArticlesController do
it "রেন্ডার করবে 'show' টেমপ্লেট" do
get :show, params: { id: 1 }
expect(response).to render_template("show")
end
endএখানে, get :show এর মাধ্যমে ArticlesController এর show একশন কল করা হয়েছে এবং পরে render_template("show") দ্বারা যাচাই করা হয়েছে যে রেসপন্সে show টেমপ্লেট রেন্ডার হয়েছে কিনা।
২. expect(response).to redirect_to
এই Matcher ব্যবহার করা হয় রিডাইরেকশন যাচাই করতে। এটি নিশ্চিত করে যে একটি একশন কোনও নির্দিষ্ট রাউটে রিডাইরেক্ট করছে।
উদাহরণ:
describe ArticlesController do
it "রিডাইরেক্ট করবে 'articles_path' এ" do
post :create, params: { article: { title: "New Article" } }
expect(response).to redirect_to(articles_path)
end
endএখানে, post :create একশনটি কল করার পর যাচাই করা হচ্ছে যে রেসপন্সে articles_path এ রিডাইরেক্ট করা হয়েছে কিনা।
৩. expect(assigns(:variable)).to
এই Matcher ব্যবহার করা হয় কন্ট্রোলারের ভেরিয়েবল অ্যাসাইনমেন্ট যাচাই করতে। এটি পরীক্ষা করে যে কন্ট্রোলার কোনো ভেরিয়েবলকে সঠিকভাবে অ্যাসাইন করেছে কিনা।
উদাহরণ:
describe ArticlesController do
it "অ্যাসাইন করবে @article" do
article = Article.create(title: "New Article")
get :show, params: { id: article.id }
expect(assigns(:article)).to eq(article)
end
endএখানে, get :show একশন কল করার পর @article ভেরিয়েবল অ্যাসাইন হয়েছে কিনা তা যাচাই করা হচ্ছে।
৪. expect(model).to be_valid
এটি ব্যবহার করা হয় মডেল ভ্যালিডেশন যাচাই করতে। এটি নিশ্চিত করে যে মডেল একটি বৈধ অবস্থা (valid state) ধারণ করছে।
উদাহরণ:
describe Article do
it "বৈধ মডেল হওয়া উচিত" do
article = Article.new(title: "Valid Article")
expect(article).to be_valid
end
endএখানে, একটি নতুন Article তৈরি করা হচ্ছে এবং যাচাই করা হচ্ছে যে এটি বৈধ কিনা।
৫. expect { block }.to change
এই Matcher ব্যবহার করা হয় অবজেক্টের স্টেট পরিবর্তন যাচাই করতে। এটি পরীক্ষা করে যে একটি নির্দিষ্ট কোড ব্লক কোনো ভেরিয়েবলের মান পরিবর্তন করেছে কিনা।
উদাহরণ:
describe Article do
it "একটি নতুন আর্টিকেল তৈরি করলে আর্টিকেল সংখ্যা বৃদ্ধি পাবে" do
expect { Article.create(title: "New Article") }.to change(Article, :count).by(1)
end
endএখানে, একটি নতুন Article তৈরি করার পরে Article.count পরিবর্তন হয়েছে কিনা তা যাচাই করা হচ্ছে।
৬. expect(model).to have_db_column
এটি ব্যবহার করা হয় ডাটাবেস কলাম যাচাই করতে। এটি নিশ্চিত করে যে নির্দিষ্ট মডেলের ডাটাবেসে একটি নির্দিষ্ট কলাম আছে।
উদাহরণ:
describe Article do
it "has a title column" do
expect(Article).to have_db_column(:title)
end
endএখানে, Article মডেলের title কলামটি ডাটাবেসে উপস্থিত কিনা তা যাচাই করা হচ্ছে।
৭. expect(model).to validate_presence_of
এটি ব্যবহার করা হয় ভ্যালিডেশন চেক করার জন্য, যেমন একটি নির্দিষ্ট ফিল্ডের প্রেসেন্স ভ্যালিডেশন চেক করা।
উদাহরণ:
describe Article do
it "যাচাই করবে যে title ফিল্ডটি উপস্থিত" do
expect(Article).to validate_presence_of(:title)
end
endএখানে, Article মডেলে title ফিল্ডে প্রেসেন্স ভ্যালিডেশন আছে কিনা তা যাচাই করা হচ্ছে।
৮. expect(model).to belong_to
এটি ব্যবহার করা হয় অ্যাসোসিয়েশন চেক করার জন্য, যেমন একটি মডেল কোনো নির্দিষ্ট মডেলের সাথে belongs_to সম্পর্কযুক্ত কিনা।
উদাহরণ:
describe Article do
it "যাচাই করবে যে এটি author এর সাথে belongs_to সম্পর্কযুক্ত" do
expect(Article).to belong_to(:author)
end
endএখানে, Article মডেলটি author মডেলের সাথে belongs_to সম্পর্কিত কিনা তা যাচাই করা হচ্ছে।
সারাংশ
Rails Specific Matchers হল RSpec-এ বিশেষভাবে Rails অ্যাপ্লিকেশন টেস্টিংয়ের জন্য তৈরি Match ধরনের টুলস। এগুলি Rails-এর বিভিন্ন ফিচার পরীক্ষা করার জন্য উপযোগী, যেমন কন্ট্রোলার রেসপন্স, মডেল ভ্যালিডেশন, ডাটাবেস কলাম, অ্যাসোসিয়েশন এবং ফাংশনাল টেস্টিং। এই Matchers ব্যবহারের মাধ্যমে Rails অ্যাপ্লিকেশনের বিভিন্ন অংশকে আরও সহজভাবে টেস্ট করা যায়।
Read more