আরও নির্ভরযোগ্য এবং রক্ষণাবেক্ষণযোগ্য সফ্টওয়্যার তৈরি করতে উন্নত Jest টেস্টিং প্যাটার্ন আয়ত্ত করুন। গ্লোবাল ডেভেলপমেন্ট টিমের জন্য মকিং, স্ন্যাপশট টেস্টিং, কাস্টম ম্যাচারের মতো কৌশলগুলি জানুন।
Jest: শক্তিশালী সফ্টওয়্যার তৈরির জন্য উন্নত টেস্টিং প্যাটার্ন
আজকের দ্রুতগতির সফ্টওয়্যার ডেভেলপমেন্টের জগতে, আপনার কোডবেসের নির্ভরযোগ্যতা এবং স্থিতিশীলতা নিশ্চিত করা সবচেয়ে গুরুত্বপূর্ণ। যদিও Jest জাভাস্ক্রিপ্ট টেস্টিংয়ের জন্য একটি ডি ফ্যাক্টো স্ট্যান্ডার্ড হয়ে উঠেছে, বেসিক ইউনিট টেস্টের বাইরে গিয়ে অ্যাপ্লিকেশনগুলিতে এক নতুন স্তরের আস্থা তৈরি করা যায়। এই পোস্টে Jest-এর উন্নত টেস্টিং প্যাটার্ন নিয়ে আলোচনা করা হয়েছে যা শক্তিশালী সফ্টওয়্যার তৈরির জন্য অপরিহার্য এবং বিশ্বজুড়ে ডেভেলপারদের জন্য উপযুক্ত।
কেন বেসিক ইউনিট টেস্টের বাইরে যাবেন?
বেসিক ইউনিট টেস্টগুলি বিচ্ছিন্নভাবে প্রতিটি কম্পোনেন্ট যাচাই করে। তবে, বাস্তব অ্যাপ্লিকেশনগুলি হলো জটিল সিস্টেম যেখানে কম্পোনেন্টগুলো একে অপরের সাথে ইন্টারঅ্যাক্ট করে। উন্নত টেস্টিং প্যাটার্নগুলি এই জটিলতাগুলি সমাধান করে আমাদের সক্ষম করে তোলে:
- জটিল ডিপেন্ডেন্সি সিমুলেট করতে।
- UI পরিবর্তন নির্ভরযোগ্যভাবে ক্যাপচার করতে।
- আরও প্রকাশযোগ্য এবং রক্ষণাবেক্ষণযোগ্য টেস্ট লিখতে।
- ইন্টিগ্রেশন পয়েন্টগুলিতে টেস্ট কভারেজ এবং আস্থা বাড়াতে।
- টেস্ট-ড্রিভেন ডেভেলপমেন্ট (TDD) এবং বিহেভিয়ার-ড্রিভেন ডেভেলপমেন্ট (BDD) ওয়ার্কফ্লো সহজতর করতে।
মকিং এবং স্পাইস আয়ত্ত করা
টেস্ট করা ইউনিটকে আলাদা করার জন্য মকিং অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি তার ডিপেন্ডেন্সিগুলোকে নিয়ন্ত্রিত বিকল্প দিয়ে প্রতিস্থাপন করে। Jest এর জন্য শক্তিশালী টুল সরবরাহ করে:
jest.fn()
: মক এবং স্পাইসের ভিত্তি
jest.fn()
একটি মক ফাংশন তৈরি করে। আপনি এর কল, আর্গুমেন্ট এবং রিটার্ন ভ্যালু ট্র্যাক করতে পারেন। এটি আরও উন্নত মকিং কৌশলের বিল্ডিং ব্লক।
উদাহরণ: ফাংশন কল ট্র্যাক করা
// component.js
export const fetchData = () => {
// একটি API কলের অনুকরণ করে
return Promise.resolve({ data: 'some data' });
};
export const processData = async (fetcher) => {
const result = await fetcher();
return `Processed: ${result.data}`;
};
// component.test.js
import { processData } from './component';
test('should process data correctly', async () => {
const mockFetcher = jest.fn().mockResolvedValue({ data: 'mocked data' });
const result = await processData(mockFetcher);
expect(result).toBe('Processed: mocked data');
expect(mockFetcher).toHaveBeenCalledTimes(1);
expect(mockFetcher).toHaveBeenCalledWith();
});
jest.spyOn()
: প্রতিস্থাপন না করে পর্যবেক্ষণ
jest.spyOn()
আপনাকে একটি বিদ্যমান অবজেক্টের মেথডের কল পর্যবেক্ষণ করার সুযোগ দেয়, তার ইমপ্লিমেন্টেশন প্রতিস্থাপন না করেই। প্রয়োজন হলে আপনি ইমপ্লিমেন্টেশন মকও করতে পারেন।
উদাহরণ: একটি মডিউল মেথডে স্পাই করা
// logger.js
export const logInfo = (message) => {
console.log(`INFO: ${message}`);
};
// service.js
import { logInfo } from './logger';
export const performTask = (taskName) => {
logInfo(`Starting task: ${taskName}`);
// ... টাস্ক লজিক ...
logInfo(`Task ${taskName} completed.`);
};
// service.test.js
import { performTask } from './service';
import * as logger from './logger';
test('should log task start and completion', () => {
const logSpy = jest.spyOn(logger, 'logInfo');
performTask('backup');
expect(logSpy).toHaveBeenCalledTimes(2);
expect(logSpy).toHaveBeenCalledWith('Starting task: backup');
expect(logSpy).toHaveBeenCalledWith('Task backup completed.');
logSpy.mockRestore(); // আসল ইমপ্লিমেন্টেশন পুনরুদ্ধার করা গুরুত্বপূর্ণ
});
মডিউল ইমপোর্ট মক করা
Jest-এর মডিউল মকিং ক্ষমতা ব্যাপক। আপনি পুরো মডিউল বা নির্দিষ্ট এক্সপোর্ট মক করতে পারেন।
উদাহরণ: একটি এক্সটার্নাল এপিআই ক্লায়েন্ট মক করা
// api.js
import axios from 'axios';
export const getUser = async (userId) => {
const response = await axios.get(`/api/users/${userId}`);
return response.data;
};
// user-service.js
import { getUser } from './api';
export const getUserFullName = async (userId) => {
const user = await getUser(userId);
return `${user.firstName} ${user.lastName}`;
};
// user-service.test.js
import { getUserFullName } from './user-service';
import * as api from './api';
// পুরো api মডিউলটি মক করুন
jest.mock('./api');
test('should get full name using mocked API', async () => {
// মক করা মডিউল থেকে নির্দিষ্ট ফাংশনটি মক করুন
api.getUser.mockResolvedValue({ id: 1, firstName: 'Ada', lastName: 'Lovelace' });
const fullName = await getUserFullName(1);
expect(fullName).toBe('Ada Lovelace');
expect(api.getUser).toHaveBeenCalledTimes(1);
expect(api.getUser).toHaveBeenCalledWith(1);
});
অটো-মকিং বনাম ম্যানুয়াল মকিং
Jest স্বয়ংক্রিয়ভাবে Node.js মডিউলগুলিকে মক করে। ES মডিউল বা কাস্টম মডিউলের জন্য, আপনার jest.mock()
প্রয়োজন হতে পারে। আরও নিয়ন্ত্রণের জন্য, আপনি __mocks__
ডিরেক্টরি তৈরি করতে পারেন।
মক ইমপ্লিমেন্টেশন
আপনি আপনার মকের জন্য কাস্টম ইমপ্লিমেন্টেশন সরবরাহ করতে পারেন।
উদাহরণ: কাস্টম ইমপ্লিমেন্টেশন দিয়ে মক করা
// math.js
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;
// calculator.js
import { add, subtract } from './math';
export const calculate = (operation, a, b) => {
if (operation === 'add') {
return add(a, b);
} else if (operation === 'subtract') {
return subtract(a, b);
}
return null;
};
// calculator.test.js
import { calculate } from './calculator';
import * as math from './math';
// পুরো math মডিউলটি মক করুন
jest.mock('./math');
test('should perform addition using mocked math add', () => {
// 'add' ফাংশনের জন্য একটি মক ইমপ্লিমেন্টেশন দিন
math.add.mockImplementation((a, b) => a + b + 10); // ফলাফলের সাথে ১০ যোগ করুন
math.subtract.mockReturnValue(5); // subtract-কে মক করুন
const result = calculate('add', 5, 3);
expect(math.add).toHaveBeenCalledWith(5, 3);
expect(result).toBe(18); // 5 + 3 + 10
const subResult = calculate('subtract', 10, 2);
expect(math.subtract).toHaveBeenCalledWith(10, 2);
expect(subResult).toBe(5);
});
স্ন্যাপশট টেস্টিং: UI এবং কনফিগারেশন সংরক্ষণ
স্ন্যাপশট টেস্ট হলো আপনার কম্পোনেন্ট বা কনফিগারেশনের আউটপুট ক্যাপচার করার জন্য একটি শক্তিশালী ফিচার। এটি বিশেষ করে UI টেস্টিং বা জটিল ডেটা স্ট্রাকচার যাচাই করার জন্য উপযোগী।
স্ন্যাপশট টেস্টিং কীভাবে কাজ করে
প্রথমবার যখন একটি স্ন্যাপশট টেস্ট চালানো হয়, Jest একটি .snap
ফাইল তৈরি করে যেখানে টেস্ট করা ভ্যালুর একটি সিরিয়ালাইজড রিপ্রেজেন্টেশন থাকে। পরবর্তী রানগুলিতে, Jest বর্তমান আউটপুটকে সংরক্ষিত স্ন্যাপশটের সাথে তুলনা করে। যদি তাদের মধ্যে পার্থক্য থাকে, তাহলে টেস্ট ব্যর্থ হয় এবং আপনাকে অনিচ্ছাকৃত পরিবর্তন সম্পর্কে সতর্ক করে। এটি বিভিন্ন অঞ্চল বা লোকেলে UI কম্পোনেন্টে রিগ্রেশন সনাক্ত করার জন্য অমূল্য।
উদাহরণ: একটি React কম্পোনেন্টের স্ন্যাপশট করা
ধরা যাক আপনার একটি React কম্পোনেন্ট আছে:
// UserProfile.js
import React from 'react';
const UserProfile = ({ name, email, isActive }) => (
<div>
<h2>{name}</h2>
<p><strong>Email:</strong> {email}</p>
<p><strong>Status:</strong> {isActive ? 'Active' : 'Inactive'}</p>
</div>
);
export default UserProfile;
// UserProfile.test.js
import React from 'react';
import renderer from 'react-test-renderer'; // React কম্পোনেন্ট স্ন্যাপশটের জন্য
import UserProfile from './UserProfile';
test('renders UserProfile correctly', () => {
const user = {
name: 'Jane Doe',
email: 'jane.doe@example.com',
isActive: true,
};
const component = renderer.create(
<UserProfile {...user} />
);
const tree = component.toJSON();
expect(tree).toMatchSnapshot();
});
test('renders inactive UserProfile correctly', () => {
const user = {
name: 'John Smith',
email: 'john.smith@example.com',
isActive: false,
};
const component = renderer.create(
<UserProfile {...user} />
);
const tree = component.toJSON();
expect(tree).toMatchSnapshot('inactive user profile'); // নামসহ স্ন্যাপশট
});
টেস্ট চালানোর পর, Jest একটি UserProfile.test.js.snap
ফাইল তৈরি করবে। যখন আপনি কম্পোনেন্ট আপডেট করবেন, আপনাকে পরিবর্তনগুলি পর্যালোচনা করতে হবে এবং সম্ভবত Jest-কে --updateSnapshot
বা -u
ফ্ল্যাগ দিয়ে চালিয়ে স্ন্যাপশট আপডেট করতে হবে।
স্ন্যাপশট টেস্টিং এর সেরা অভ্যাস
- UI কম্পোনেন্ট এবং কনফিগারেশন ফাইলের জন্য ব্যবহার করুন: UI এলিমেন্টগুলি প্রত্যাশা অনুযায়ী রেন্ডার হচ্ছে এবং কনফিগারেশন অনিচ্ছাকৃতভাবে পরিবর্তিত হচ্ছে না তা নিশ্চিত করার জন্য আদর্শ।
- স্ন্যাপশটগুলি সাবধানে পর্যালোচনা করুন: অন্ধভাবে স্ন্যাপশট আপডেট গ্রহণ করবেন না। পরিবর্তনগুলি ইচ্ছাকৃত কিনা তা নিশ্চিত করতে সর্বদা কী পরিবর্তন হয়েছে তা পর্যালোচনা করুন।
- ঘন ঘন পরিবর্তনশীল ডেটার জন্য স্ন্যাপশট এড়িয়ে চলুন: যদি ডেটা দ্রুত পরিবর্তিত হয়, স্ন্যাপশটগুলি ভঙ্গুর হয়ে যেতে পারে এবং অতিরিক্ত কোলাহল সৃষ্টি করতে পারে।
- নামসহ স্ন্যাপশট ব্যবহার করুন: একটি কম্পোনেন্টের একাধিক অবস্থা পরীক্ষা করার জন্য, নামসহ স্ন্যাপশটগুলি আরও স্পষ্টতা প্রদান করে।
কাস্টম ম্যাচার: টেস্টের পঠনযোগ্যতা বৃদ্ধি
Jest-এর বিল্ট-ইন ম্যাচারগুলি ব্যাপক, কিন্তু কখনও কখনও আপনার নির্দিষ্ট শর্ত যাচাই করার প্রয়োজন হয় যা কভার করা হয়নি। কাস্টম ম্যাচারগুলি আপনাকে আপনার নিজস্ব অ্যাসারশন লজিক তৈরি করতে দেয়, যা আপনার টেস্টগুলিকে আরও প্রকাশযোগ্য এবং পঠনযোগ্য করে তোলে।
কাস্টম ম্যাচার তৈরি করা
আপনি Jest-এর expect
অবজেক্টকে আপনার নিজস্ব ম্যাচার দিয়ে প্রসারিত করতে পারেন।
উদাহরণ: একটি বৈধ ইমেল ফর্ম্যাট পরীক্ষা করা
আপনার Jest সেটআপ ফাইলে (যেমন, jest.setup.js
, যা jest.config.js
-এ কনফিগার করা):
// jest.setup.js
expect.extend({
toBeValidEmail(received) {
const emailRegex = /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/;
const pass = emailRegex.test(received);
if (pass) {
return {
message: () => `expected ${received} not to be a valid email`,
pass: true,
};
} else {
return {
message: () => `expected ${received} to be a valid email`,
pass: false,
};
}
},
});
// আপনার jest.config.js-এ
// module.exports = { setupFilesAfterEnv: ['/jest.setup.js'] };
আপনার টেস্ট ফাইলে:
// validation.test.js
test('should validate email formats', () => {
expect('test@example.com').toBeValidEmail();
expect('invalid-email').not.toBeValidEmail();
expect('another.test@sub.domain.co.uk').toBeValidEmail();
});
কাস্টম ম্যাচারের সুবিধা
- উন্নত পঠনযোগ্যতা: টেস্টগুলি আরও বর্ণনামূলক হয়, *কীভাবে* পরীক্ষা করা হচ্ছে তার পরিবর্তে *কী* পরীক্ষা করা হচ্ছে তা বলে।
- কোড পুনঃব্যবহারযোগ্যতা: একাধিক টেস্টে জটিল অ্যাসারশন লজিকের পুনরাবৃত্তি এড়িয়ে চলুন।
- ডোমেন-নির্দিষ্ট অ্যাসারশন: আপনার অ্যাপ্লিকেশনের নির্দিষ্ট ডোমেন প্রয়োজনীয়তার সাথে অ্যাসারশনগুলি মানানসই করুন।
অ্যাসিঙ্ক্রোনাস অপারেশন টেস্টিং
জাভাস্ক্রিপ্ট ব্যাপকভাবে অ্যাসিঙ্ক্রোনাস। Jest প্রমিস এবং async/await পরীক্ষা করার জন্য চমৎকার সমর্থন প্রদান করে।
async/await
ব্যবহার করা
এটি অ্যাসিঙ্ক্রোনাস কোড পরীক্ষা করার আধুনিক এবং সবচেয়ে পঠনযোগ্য উপায়।
উদাহরণ: একটি অ্যাসিঙ্ক্রোনাস ফাংশন টেস্টিং
// dataService.js
export const fetchUserData = async (userId) => {
// একটি বিলম্বের পরে ডেটা আনার অনুকরণ
await new Promise(resolve => setTimeout(resolve, 50));
if (userId === 1) {
return { id: 1, name: 'Alice' };
} else {
throw new Error('User not found');
}
};
// dataService.test.js
import { fetchUserData } from './dataService';
test('fetches user data correctly', async () => {
const user = await fetchUserData(1);
expect(user).toEqual({ id: 1, name: 'Alice' });
});
test('throws error for non-existent user', async () => {
await expect(fetchUserData(2)).rejects.toThrow('User not found');
});
.resolves
এবং .rejects
ব্যবহার করা
এই ম্যাচারগুলি প্রমিস রেজোলিউশন এবং রিজেকশন পরীক্ষা করা সহজ করে তোলে।
উদাহরণ: .resolves/.rejects ব্যবহার করা
// dataService.test.js (চলবে)
test('fetches user data with .resolves', () => {
return expect(fetchUserData(1)).resolves.toEqual({ id: 1, name: 'Alice' });
});
test('throws error for non-existent user with .rejects', () => {
return expect(fetchUserData(2)).rejects.toThrow('User not found');
});
টাইমার হ্যান্ডলিং
setTimeout
বা setInterval
ব্যবহার করে এমন ফাংশনের জন্য, Jest টাইমার নিয়ন্ত্রণের সুবিধা দেয়।
উদাহরণ: টাইমার নিয়ন্ত্রণ করা
// delayedGreeter.js
export const greetAfterDelay = (name, callback) => {
setTimeout(() => {
callback(`Hello, ${name}!`);
}, 1000);
};
// delayedGreeter.test.js
import { greetAfterDelay } from './delayedGreeter';
jest.useFakeTimers(); // ফেইক টাইমার সক্রিয় করুন
test('greets after delay', () => {
const mockCallback = jest.fn();
greetAfterDelay('World', mockCallback);
// টাইমারকে 1000ms এগিয়ে নিন
jest.advanceTimersByTime(1000);
expect(mockCallback).toHaveBeenCalledTimes(1);
expect(mockCallback).toHaveBeenCalledWith('Hello, World!');
});
// প্রয়োজনে আসল টাইমার পুনরুদ্ধার করুন
jest.useRealTimers();
টেস্টের সংগঠন এবং কাঠামো
আপনার টেস্ট স্যুট বড় হওয়ার সাথে সাথে রক্ষণাবেক্ষণের জন্য সংগঠন অত্যন্ত গুরুত্বপূর্ণ হয়ে ওঠে।
Describe ব্লক এবং It ব্লক
সম্পর্কিত টেস্টগুলিকে গ্রুপ করার জন্য describe
এবং পৃথক টেস্ট কেসের জন্য it
(বা test
) ব্যবহার করুন। এই কাঠামোটি অ্যাপ্লিকেশনের মডিউলারিটি প্রতিফলিত করে।
উদাহরণ: কাঠামোগত টেস্ট
describe('User Authentication Service', () => {
let authService;
beforeEach(() => {
// প্রতিটি টেস্টের আগে মক বা সার্ভিস ইনস্ট্যান্স সেটআপ করুন
authService = require('./authService');
jest.spyOn(authService, 'login').mockImplementation(() => Promise.resolve({ token: 'fake_token' }));
});
afterEach(() => {
// মক পরিষ্কার করুন
jest.restoreAllMocks();
});
describe('login functionality', () => {
it('should successfully log in a user with valid credentials', async () => {
const result = await authService.login('user@example.com', 'password123');
expect(result.token).toBeDefined();
// ... আরও অ্যাসারশন ...
});
it('should fail login with invalid credentials', async () => {
jest.spyOn(authService, 'login').mockRejectedValue(new Error('Invalid credentials'));
await expect(authService.login('user@example.com', 'wrong_password')).rejects.toThrow('Invalid credentials');
});
});
describe('logout functionality', () => {
it('should clear user session', async () => {
// লগআউট লজিক পরীক্ষা করুন...
});
});
});
সেটআপ এবং টিয়ারডাউন হুক
beforeAll
: একটিdescribe
ব্লকের সমস্ত টেস্টের আগে একবার চলে।afterAll
: একটিdescribe
ব্লকের সমস্ত টেস্টের পরে একবার চলে।beforeEach
: একটিdescribe
ব্লকের প্রতিটি টেস্টের আগে চলে।afterEach
: একটিdescribe
ব্লকের প্রতিটি টেস্টের পরে চলে।
এই হুকগুলি মক ডেটা সেটআপ করা, ডাটাবেস সংযোগ স্থাপন করা বা টেস্টগুলির মধ্যে রিসোর্স পরিষ্কার করার জন্য অপরিহার্য।
গ্লোবাল দর্শকদের জন্য টেস্টিং
যখন গ্লোবাল দর্শকদের জন্য অ্যাপ্লিকেশন তৈরি করা হয়, তখন টেস্টিংয়ের বিবেচনা প্রসারিত হয়:
আন্তর্জাতিকীকরণ (i18n) এবং স্থানীয়করণ (l10n)
নিশ্চিত করুন যে আপনার UI এবং বার্তাগুলি বিভিন্ন ভাষা এবং আঞ্চলিক ফর্ম্যাটের সাথে সঠিকভাবে খাপ খায়।
- স্থানীয়কৃত UI-এর স্ন্যাপশট করা: স্ন্যাপশট টেস্ট ব্যবহার করে পরীক্ষা করুন যে আপনার UI-এর বিভিন্ন ভাষার সংস্করণ সঠিকভাবে রেন্ডার হচ্ছে।
- লোকেল ডেটা মক করা: বিভিন্ন লোকেল বার্তা সহ কম্পোনেন্টের আচরণ পরীক্ষা করার জন্য
react-intl
বাi18next
এর মতো লাইব্রেরি মক করুন। - তারিখ, সময় এবং মুদ্রা ফর্ম্যাটিং: কাস্টম ম্যাচার ব্যবহার করে বা আন্তর্জাতিকীকরণ লাইব্রেরি মক করে এগুলি সঠিকভাবে হ্যান্ডেল করা হচ্ছে কিনা তা পরীক্ষা করুন। উদাহরণস্বরূপ, জার্মানির জন্য ফর্ম্যাট করা তারিখ (DD.MM.YYYY) মার্কিন যুক্তরাষ্ট্রের (MM/DD/YYYY) থেকে ভিন্নভাবে প্রদর্শিত হচ্ছে কিনা তা যাচাই করা।
উদাহরণ: স্থানীয়কৃত তারিখ ফর্ম্যাটিং পরীক্ষা করা
// dateUtils.js
export const formatLocalizedDate = (date, locale) => {
return new Intl.DateTimeFormat(locale, { year: 'numeric', month: 'numeric', day: 'numeric' }).format(date);
};
// dateUtils.test.js
import { formatLocalizedDate } from './dateUtils';
test('formats date correctly for US locale', () => {
const date = new Date(2023, 10, 15); // November 15, 2023
expect(formatLocalizedDate(date, 'en-US')).toBe('11/15/2023');
});
test('formats date correctly for German locale', () => {
const date = new Date(2023, 10, 15);
expect(formatLocalizedDate(date, 'de-DE')).toBe('15.11.2023');
});
টাইম জোন সচেতনতা
আপনার অ্যাপ্লিকেশন বিভিন্ন টাইম জোন কীভাবে হ্যান্ডেল করে তা পরীক্ষা করুন, বিশেষ করে সময়সূচী বা রিয়েল-টাইম আপডেটের মতো বৈশিষ্ট্যগুলির জন্য। সিস্টেম ঘড়ি মক করা বা সময় জোন অ্যাবস্ট্র্যাক্ট করে এমন লাইব্রেরি ব্যবহার করা উপকারী হতে পারে।
ডেটাতে সাংস্কৃতিক সূক্ষ্মতা
সংখ্যা, মুদ্রা এবং অন্যান্য ডেটা উপস্থাপনা বিভিন্ন সংস্কৃতিতে কীভাবে ভিন্নভাবে অনুভূত বা প্রত্যাশিত হতে পারে তা বিবেচনা করুন। কাস্টম ম্যাচারগুলি এখানে বিশেষভাবে কার্যকর হতে পারে।
উন্নত কৌশল এবং স্ট্র্যাটেজি
টেস্ট-ড্রিভেন ডেভেলপমেন্ট (TDD) এবং বিহেভিয়ার-ড্রিভেন ডেভেলপমেন্ট (BDD)
Jest, TDD (Red-Green-Refactor) এবং BDD (Given-When-Then) পদ্ধতির সাথে ভালোভাবে খাপ খায়। ইমপ্লিমেন্টেশন কোড লেখার আগে কাঙ্ক্ষিত আচরণ বর্ণনা করে এমন টেস্ট লিখুন। এটি নিশ্চিত করে যে কোডটি শুরু থেকেই টেস্টেবিলিটির কথা মাথায় রেখে লেখা হয়েছে।
Jest এর সাথে ইন্টিগ্রেশন টেস্টিং
যদিও Jest ইউনিট টেস্টে পারদর্শী, এটি ইন্টিগ্রেশন টেস্টের জন্যও ব্যবহার করা যেতে পারে। কম ডিপেন্ডেন্সি মক করা বা Jest-এর runInBand
বিকল্পের মতো টুল ব্যবহার করা সাহায্য করতে পারে।
উদাহরণ: API ইন্টারঅ্যাকশন টেস্টিং (সরলীকৃত)
// apiService.js
import axios from 'axios';
const API_BASE_URL = 'https://api.example.com';
export const createProduct = async (productData) => {
const response = await axios.post(`${API_BASE_URL}/products`, productData);
return response.data;
};
// apiService.test.js (ইন্টিগ্রেশন টেস্ট)
import axios from 'axios';
import { createProduct } from './apiService';
// নেটওয়ার্ক লেয়ার নিয়ন্ত্রণ করতে ইন্টিগ্রেশন টেস্টের জন্য axios মক করুন
jest.mock('axios');
test('creates a product via API', async () => {
const mockProduct = { id: 1, name: 'Gadget' };
const responseData = { success: true, product: mockProduct };
axios.post.mockResolvedValue({
data: responseData,
status: 201,
headers: { 'content-type': 'application/json' },
});
const newProductData = { name: 'Gadget', price: 99.99 };
const result = await createProduct(newProductData);
expect(axios.post).toHaveBeenCalledWith(`${process.env.API_BASE_URL || 'https://api.example.com'}/products`, newProductData);
expect(result).toEqual(responseData);
});
সমান্তরালতা এবং কনফিগারেশন
Jest এক্সিকিউশন দ্রুত করার জন্য সমান্তরালভাবে টেস্ট চালাতে পারে। এটি আপনার jest.config.js
-এ কনফিগার করুন। উদাহরণস্বরূপ, maxWorkers
সেট করা সমান্তরাল প্রসেসের সংখ্যা নিয়ন্ত্রণ করে।
কভারেজ রিপোর্ট
আপনার কোডবেসের যে অংশগুলি পরীক্ষা করা হচ্ছে না তা সনাক্ত করতে Jest-এর বিল্ট-ইন কভারেজ রিপোর্টিং ব্যবহার করুন। বিস্তারিত রিপোর্ট তৈরি করতে --coverage
সহ টেস্ট চালান।
jest --coverage
কভারেজ রিপোর্ট পর্যালোচনা করা নিশ্চিত করতে সাহায্য করে যে আপনার উন্নত টেস্টিং প্যাটার্নগুলি আন্তর্জাতিকীকরণ এবং স্থানীয়করণ কোড পাথ সহ গুরুত্বপূর্ণ লজিককে কার্যকরভাবে কভার করছে।
উপসংহার
উন্নত Jest টেস্টিং প্যাটার্ন আয়ত্ত করা বিশ্বব্যাপী দর্শকদের জন্য নির্ভরযোগ্য, রক্ষণাবেক্ষণযোগ্য এবং উচ্চ-মানের সফ্টওয়্যার তৈরির দিকে একটি গুরুত্বপূর্ণ পদক্ষেপ। মকিং, স্ন্যাপশট টেস্টিং, কাস্টম ম্যাচার এবং অ্যাসিঙ্ক্রোনাস টেস্টিং কৌশলগুলি কার্যকরভাবে ব্যবহার করে, আপনি আপনার টেস্ট স্যুটের দৃঢ়তা বাড়াতে পারেন এবং বিভিন্ন পরিস্থিতি এবং অঞ্চলে আপনার অ্যাপ্লিকেশনের আচরণে আরও বেশি আস্থা অর্জন করতে পারেন। এই প্যাটার্নগুলি গ্রহণ করা বিশ্বজুড়ে ডেভেলপমেন্ট টিমকে ব্যতিক্রমী ব্যবহারকারীর অভিজ্ঞতা প্রদানে ক্ষমতায়ন করে।
আপনার জাভাস্ক্রিপ্ট টেস্টিং অনুশীলনকে উন্নত করতে আজই আপনার ওয়ার্কফ্লোতে এই উন্নত কৌশলগুলি অন্তর্ভুক্ত করা শুরু করুন।