ইন্টিগ্রেশন পরীক্ষা যাচাই করুন যে আপনার API-এর অংশগুলি সঠিকভাবে একসাথে কাজ করে — রুট, ডাটাবেস এবং ব্যবসায়িক যুক্তি — বাস্তব অনুরোধ করে এবং বাস্তব প্রতিক্রিয়াগুলি পরীক্ষা করে৷ ইউনিট পরীক্ষার বিপরীতে (যা সবকিছু উপহাস করে), ইন্টিগ্রেশন পরীক্ষাগুলি সীমানায় বাগ ধরতে পারে। এই নির্দেশিকা দেখায় কিভাবে তাদের ভাল লিখতে হয়।
📋 Table of Contents
- ইউনিট বনাম ইন্টিগ্রেশন টেস্ট
- Node.js: Supertest দিয়ে পরীক্ষা করা হচ্ছে
- Python: pytest এবং TestClient দিয়ে পরীক্ষা করা হচ্ছে
- একটি পরীক্ষা ডাটাবেস ব্যবহার করে
- প্রমাণীকৃত এন্ডপয়েন্ট পরীক্ষা করা হচ্ছে
- CI তে ইন্টিগ্রেশন টেস্ট চলছে
- সর্বোত্তম অভ্যাস
- প্রশ্ন: আমি কি ইন্টিগ্রেশন পরীক্ষায় ডাটাবেসকে উপহাস করব?
- ইন্টিগ্রেশন পরীক্ষা আপনার API কাজ শেষ থেকে শেষ যাচাই করে — রুট, ডাটাবেস এবং লজিক একসাথে — তারের বাগগুলি ধরা যা ইউনিট পরীক্ষা মিস করে। ব্যবহার করুন
ইউনিট বনাম ইন্টিগ্রেশন টেস্ট
| দৃষ্টিভঙ্গি | ইউনিট পরীক্ষা | ইন্টিগ্রেশন টেস্ট |
|---|---|---|
| সুযোগ | বিচ্ছিন্নভাবে একটি ফাংশন | একাধিক অংশ একসাথে (রুট + ডিবি) |
| নির্ভরতা | উপহাস | বাস্তব (বা পরীক্ষা) ডাটাবেস |
| গতি | খুব দ্রুত | ধীর (বাস্তব I/O) |
| ক্যাচ | লজিক বাগ | ইন্টিগ্রেশন/ওয়্যারিং বাগ |
আপনি উভয়ই চান — যুক্তির জন্য ইউনিট পরীক্ষা, সমগ্র অনুরোধ-প্রতিক্রিয়া প্রবাহের কাজগুলি যাচাই করতে ইন্টিগ্রেশন পরীক্ষা।
Node.js: Supertest দিয়ে পরীক্ষা করা হচ্ছে
npm install --save-dev jest supertest
// Export your app WITHOUT calling listen() so tests can use it
// app.js
const express = require('express');
const app = express();
app.use(express.json());
app.get('/users/:id', getUser);
app.post('/users', createUser);
module.exports = app; // export the app
// server.js (separate) starts it
const app = require('./app');
app.listen(3000);
// users.test.js
const request = require('supertest');
const app = require('./app');
const db = require('./db');
describe('Users API', () => {
beforeEach(async () => {
await db.reset(); // clean database before each test
});
afterAll(async () => {
await db.close();
});
it('creates a user', async () => {
const res = await request(app)
.post('/users')
.send({ name: 'Alice', email: 'alice@example.com' });
expect(res.status).toBe(201);
expect(res.body).toMatchObject({ name: 'Alice' });
expect(res.body.id).toBeDefined();
});
it('returns 404 for missing user', async () => {
const res = await request(app).get('/users/999');
expect(res.status).toBe(404);
});
it('validates required fields', async () => {
const res = await request(app).post('/users').send({});
expect(res.status).toBe(400);
expect(res.body.error).toBeDefined();
});
});
Python: pytest এবং TestClient দিয়ে পরীক্ষা করা হচ্ছে
pip install pytest httpx
# test_users.py (FastAPI example)
import pytest
from fastapi.testclient import TestClient
from app.main import app
from app.database import get_test_db
client = TestClient(app)
@pytest.fixture(autouse=True)
def reset_db():
db = get_test_db()
db.reset()
yield
db.close()
def test_create_user():
response = client.post("/users", json={
"name": "Alice", "email": "alice@example.com"
})
assert response.status_code == 201
data = response.json()
assert data["name"] == "Alice"
assert "id" in data
def test_get_missing_user():
response = client.get("/users/999")
assert response.status_code == 404
def test_validation_error():
response = client.post("/users", json={})
assert response.status_code == 422
একটি পরীক্ষা ডাটাবেস ব্যবহার করে
ইন্টিগ্রেশন পরীক্ষার জন্য একটি বাস্তব (পরীক্ষা) ডাটাবেস প্রয়োজন — উন্নয়ন এবং উত্পাদন থেকে পৃথক:
# Spin up a test database with Docker
docker run -d --name test-db -p 5433:5432 \
-e POSTGRES_DB=testdb -e POSTGRES_PASSWORD=test \
postgres:15-alpine
# Point tests at it via environment
DATABASE_URL=postgresql://postgres:test@localhost:5433/testdb
// Fast reset using transactions (rollback after each test)
beforeEach(async () => {
await db.query('BEGIN');
});
afterEach(async () => {
await db.query('ROLLBACK'); // undo all changes — fast and clean
});
প্রমাণীকৃত এন্ডপয়েন্ট পরীক্ষা করা হচ্ছে
describe('Protected routes', () => {
let token;
beforeAll(async () => {
const res = await request(app)
.post('/login')
.send({ email: 'test@example.com', password: 'password' });
token = res.body.accessToken;
});
it('allows access with valid token', async () => {
const res = await request(app)
.get('/protected')
.set('Authorization', `Bearer ${token}`);
expect(res.status).toBe(200);
});
it('rejects without token', async () => {
const res = await request(app).get('/protected');
expect(res.status).toBe(401);
});
});
CI তে ইন্টিগ্রেশন টেস্ট চলছে
# GitHub Actions with a service database
jobs:
test:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:15
env:
POSTGRES_DB: testdb
POSTGRES_PASSWORD: test
ports: ['5432:5432']
options: --health-cmd pg_isready --health-interval 10s
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '20' }
- run: npm ci
- run: npm run test:integration
env:
DATABASE_URL: postgresql://postgres:test@localhost:5432/testdb
সর্বোত্তম অভ্যাস
- বিচ্ছিন্ন পরীক্ষা: প্রতিটি পরীক্ষা স্বাধীন হওয়া উচিত — পরীক্ষার মধ্যে ডাটাবেস পুনরায় সেট করুন
- চুক্তি পরীক্ষা করুন: স্ট্যাটাস কোড, প্রতিক্রিয়া আকৃতি এবং ত্রুটির ক্ষেত্রে যাচাই করুন
- কভার ত্রুটি পথ: পরীক্ষা 400s, 401s, 404s, এবং বৈধতা ব্যর্থতা, শুধু সুখী পথ নয়
- একটি বাস্তব পরীক্ষার ডাটাবেস ব্যবহার করুন: ইন্টিগ্রেশন পরীক্ষায় ডাটাবেসকে উপহাস করবেন না
- তাদের যুক্তিসঙ্গতভাবে দ্রুত রাখুন: লেনদেন রোলব্যাক টেবিল কাটার চেয়ে দ্রুততর CI তে চালান:
- ইন্টিগ্রেশন পরীক্ষায় তারের বাগ ধরা পড়ে যা ইউনিট পরীক্ষা মিস করেপ্রায়শই জিজ্ঞাসিত প্রশ্ন
প্রশ্ন: আমি কি ইন্টিগ্রেশন পরীক্ষায় ডাটাবেসকে উপহাস করব?
উত্তর: না — পয়েন্টটি ডাটাবেস সহ বাস্তব মিথস্ক্রিয়া যাচাই করছে। একটি পৃথক পরীক্ষা ডাটাবেস ব্যবহার করুন. উপহাস করা এটিকে একটি ইউনিট পরীক্ষায় পরিণত করে এবং আপনি যে ইন্টিগ্রেশন বাগগুলি ধরার চেষ্টা করছেন তা মিস করে।
প্রশ্ন: আমি কিভাবে ইন্টিগ্রেশন পরীক্ষা দ্রুত রাখতে পারি?
উত্তর: সারণী ছাঁটাই/পুনরায় তৈরি করার পরিবর্তে পরীক্ষার মধ্যে লেনদেন রোলব্যাক ব্যবহার করুন। সমান্তরালভাবে পরীক্ষা চালান যেখানে বিচ্ছিন্নতা অনুমতি দেয়। একটি কন্টেইনারাইজড ডাটাবেস ব্যবহার করুন এবং এটি ছোট রাখুন।
প্রশ্নঃ আমার কতগুলো ইন্টিগ্রেশন টেস্ট দরকার?
উত্তর: প্রতিটি শেষ বিন্দুর সমালোচনামূলক পথগুলি কভার করুন — সাফল্য, বৈধতা ত্রুটি, প্রমাণীকরণ ব্যর্থতা, এবং পাওয়া যায়নি এমন ক্ষেত্রে। ইউনিট পরীক্ষা যুক্তির বিবরণ পরিচালনা করে; ইন্টিগ্রেশন পরীক্ষা প্রতিটি শেষ বিন্দুর প্রধান আচরণ কভার করে।
প্রশ্ন: ইন্টিগ্রেশন পরীক্ষা বা E2E পরীক্ষা?
উত্তর: ইন্টিগ্রেশন পরীক্ষা API স্তর (রুট + ডাটাবেস) যাচাই করে। E2E পরীক্ষাগুলি UI এর মাধ্যমে সম্পূর্ণ ব্যবহারকারীর প্রবাহ যাচাই করে। উভয়েরই মান আছে — E2E এর চেয়ে বেশি ইন্টিগ্রেশন পরীক্ষা আছে কারণ তারা দ্রুত এবং আরও ফোকাসড।
প্রশ্ন: আমি কিভাবে বহিরাগত API কল পরীক্ষা করব?
উত্তর: আপনার ডাটাবেসকে আসল রেখে সেই নির্দিষ্ট কলগুলিকে উপহাস করুন (আপনি তৃতীয় পক্ষের পরিষেবাগুলিতে পরীক্ষা করতে চান না)। শুধুমাত্র সত্য বহিরাগত নির্ভরতা উপহাস, আপনার নিজস্ব ডাটাবেস নয়.
উপসংহার
ইন্টিগ্রেশন পরীক্ষা আপনার API কাজ শেষ থেকে শেষ যাচাই করে — রুট, ডাটাবেস এবং লজিক একসাথে — তারের বাগগুলি ধরা যা ইউনিট পরীক্ষা মিস করে। ব্যবহার করুন
Jest (Node.js) এর সাথে সুপারটেস্ট বা TestClient (Python) এর সাথে pytest, তাদের একটি বাস্তব পরীক্ষার ডাটাবেসে নির্দেশ করুন (গতির জন্য লেনদেনের রোলব্যাকের মাধ্যমে পরীক্ষার মধ্যে পুনরায় সেট করুন), এবং সাফল্যের ক্ষেত্রে, বৈধতা ত্রুটি, প্রমাণীকরণ এবং খুঁজে পাওয়া না যাওয়া পথগুলি কভার করুন৷ একটি পরিষেবা ডাটাবেস দিয়ে CI এ চালান। যুক্তির জন্য ইউনিট পরীক্ষার সাথে একত্রিত, ইন্টিগ্রেশন পরীক্ষা আপনাকে আত্মবিশ্বাস দেয় যে আপনার API আসলে ক্লায়েন্টদের প্রত্যাশা অনুযায়ী কাজ করে।, তাদের একটি বাস্তব পরীক্ষার ডাটাবেসে নির্দেশ করুন (গতির জন্য লেনদেনের রোলব্যাকের মাধ্যমে পরীক্ষার মধ্যে পুনরায় সেট করুন), এবং সাফল্যের ক্ষেত্রে, বৈধতা ত্রুটি, প্রমাণীকরণ এবং খুঁজে পাওয়া না যাওয়া পথগুলি কভার করুন৷ একটি পরিষেবা ডাটাবেস দিয়ে CI এ চালান। যুক্তির জন্য ইউনিট পরীক্ষার সাথে একত্রিত, ইন্টিগ্রেশন পরীক্ষা আপনাকে আত্মবিশ্বাস দেয় যে আপনার API আসলে ক্লায়েন্টদের প্রত্যাশা অনুযায়ী কাজ করে।
🔗 Share this article
✍️ Leave a Comment