Testing এবং TDD (Test-Driven Development)

এক্সপ্রেসজেএস (ExpressJS) - Web Development

286

Testing বা পরীক্ষা করা একটি গুরুত্বপূর্ণ প্রক্রিয়া, যা সফটওয়্যার ডেভেলপমেন্টে কোডের গুণগত মান নিশ্চিত করে। ExpressJS অ্যাপ্লিকেশনে Testing এবং TDD (Test-Driven Development) কার্যকরীভাবে ব্যবহৃত হয় যাতে কোডের কার্যকারিতা, নিরাপত্তা, এবং স্থায়িত্ব নিশ্চিত করা যায়। TDD পদ্ধতিতে কোড লেখার আগে পরীক্ষা (test) লেখা হয়, যা কোডের কার্যকারিতা আগে থেকেই নির্ধারণ করে দেয়।


১. Testing এবং TDD কী?

  • Testing: কোড বা অ্যাপ্লিকেশন পরীক্ষা করার মাধ্যমে এর কার্যকারিতা নিশ্চিত করা হয়। এটি ব্যবহারকারীর কাছ থেকে আসা রিকোয়েস্টের সঠিক রেসপন্স নিশ্চিত করে এবং সিস্টেমের কোন ভুল বা ত্রুটি আছে কিনা তা পরীক্ষা করে।
  • TDD (Test-Driven Development): এটি একটি সফটওয়্যার ডেভেলপমেন্ট পদ্ধতি যেখানে প্রথমে পরীক্ষাগুলি লেখা হয়, তারপর সেই পরীক্ষার ভিত্তিতে কোড তৈরি করা হয়। এতে কোডের সঠিকতা এবং স্থায়িত্ব বৃদ্ধি পায়।

TDD পদ্ধতির ধাপগুলো:

  1. একটি পরীক্ষা লিখুন।
  2. কোড লিখুন যা পরীক্ষা সফলভাবে পাস করবে।
  3. পরীক্ষা পাস হলে কোড রিফ্যাক্টর করুন।

২. ExpressJS অ্যাপ্লিকেশনে Testing করার জন্য প্রয়োজনীয় প্যাকেজ

ExpressJS অ্যাপ্লিকেশন পরীক্ষা করার জন্য বিভিন্ন টেস্টিং ফ্রেমওয়ার্ক এবং টুলস ব্যবহার করা যেতে পারে। কিছু জনপ্রিয় টেস্টিং প্যাকেজ:

  • Mocha: JavaScript টেস্ট ফ্রেমওয়ার্ক
  • Chai: Assertion library (assertion verification এর জন্য)
  • Supertest: HTTP assertion library, যেটি API টেস্টিংয়ের জন্য ব্যবহৃত হয়।

২.১. প্যাকেজ ইনস্টল করা

npm install --save-dev mocha chai supertest

৩. ExpressJS অ্যাপ্লিকেশন টেস্ট করা

ধরা যাক, আপনার একটি ExpressJS অ্যাপ্লিকেশন আছে এবং আপনি এটি পরীক্ষা করতে চান। এর জন্য আমরা Mocha এবং Supertest ব্যবহার করে একটি সিম্পল টেস্ট তৈরি করবো।

৩.১. Express অ্যাপের জন্য টেস্ট লেখা

// app.js
const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.status(200).send('Hello, World!');
});

module.exports = app;

এখন, আমরা এই অ্যাপ্লিকেশনটির জন্য একটি টেস্ট লিখব।

// test/app.test.js
const request = require('supertest');
const app = require('../app');
const { expect } = require('chai');

describe('GET /', () => {
  it('should return a 200 status and Hello, World! message', (done) => {
    request(app)
      .get('/')
      .expect(200)
      .expect('Content-Type', /text/)
      .end((err, res) => {
        expect(res.text).to.equal('Hello, World!');
        done();
      });
  });
});

৩.২. টেস্ট রান করা

Mocha দিয়ে টেস্ট রান করা যাবে:

npx mocha test/app.test.js

এটি পরীক্ষা করবে যে / রাউটে 200 স্ট্যাটাস এবং সঠিক টেক্সট মেসেজ ফেরত আসছে কিনা।


৪. TDD (Test-Driven Development) এ কোড লেখার প্রক্রিয়া

TDD পদ্ধতি ব্যবহার করার জন্য প্রথমে টেস্ট লিখতে হয়। এরপর সেই টেস্ট পাস করার জন্য কোড লেখা হয়। উদাহরণস্বরূপ, যদি আপনি একটি নতুন রাউট লিখতে চান, তাহলে আগে সেই রাউটের জন্য টেস্ট লিখবেন, তারপর কোড লেখবেন।

৪.১. TDD এ নতুন ফিচার তৈরি করার উদাহরণ

ধরা যাক, আপনি /users রাউট তৈরি করতে চান যা একটি ব্যবহারকারীর তালিকা ফিরিয়ে দিবে।

ধাপ ১: টেস্ট লেখা

// test/users.test.js
const request = require('supertest');
const app = require('../app');
const { expect } = require('chai');

describe('GET /users', () => {
  it('should return a 200 status and an array of users', (done) => {
    request(app)
      .get('/users')
      .expect(200)
      .end((err, res) => {
        expect(res.body).to.be.an('array');
        expect(res.body).to.have.length.above(0);
        done();
      });
  });
});

ধাপ ২: কোড লেখা

এখন কোড লেখা যাক যেটি টেস্ট পাস করবে:

// app.js
const express = require('express');
const app = express();

// Dummy data
const users = [
  { id: 1, name: 'John' },
  { id: 2, name: 'Jane' }
];

// GET /users রাউট
app.get('/users', (req, res) => {
  res.status(200).json(users);
});

module.exports = app;

ধাপ ৩: টেস্ট রান করা

npx mocha test/users.test.js

এখন আপনি পরীক্ষা করতে পারবেন যে /users রাউট সঠিকভাবে কাজ করছে কিনা এবং সঠিক রেসপন্স পাচ্ছেন কিনা।


৫. ExpressJS অ্যাপ্লিকেশন টেস্টে Best Practices

  • মডুলার কোড: আপনার অ্যাপ্লিকেশনকে ছোট ছোট মডিউলে ভাগ করুন, যাতে প্রত্যেকটি অংশ আলাদাভাবে পরীক্ষা করা যায়।
  • Mocks এবং Stubs: কোনো ডাটাবেস বা এক্সটার্নাল সার্ভিসের সাথে ইন্টারঅ্যাকশন থাকলে, সেগুলো মক করে টেস্ট চালান, যাতে টেস্ট দ্রুত এবং নির্ভুল হয়।
  • Test Coverage: কোডের অধিকাংশ অংশে টেস্ট কভারেজ নিশ্চিত করুন, যাতে অপ্রত্যাশিত বাগ এড়িয়ে চলা যায়।

সারাংশ

ExpressJS-এ Testing এবং TDD (Test-Driven Development) একটি কার্যকরী পদ্ধতি যা কোডের গুণগত মান এবং স্থায়িত্ব নিশ্চিত করতে সহায়তা করে। Mocha, Chai এবং Supertest ব্যবহার করে আপনি আপনার Express অ্যাপ্লিকেশনটি পরীক্ষা করতে পারেন। TDD পদ্ধতিতে কোড লেখার আগে পরীক্ষাগুলি লেখা হয়, যা কোডের সঠিকতা এবং কার্যকারিতা নিশ্চিত করে।

Content added By

Unit Testing হল একটি প্রোগ্রামিং পদ্ধতি যার মাধ্যমে প্রতিটি ফাংশন বা মডিউলকে স্বাধীনভাবে পরীক্ষা করা হয়, যাতে তারা সঠিকভাবে কাজ করছে কিনা তা নিশ্চিত করা যায়। ExpressJS অ্যাপ্লিকেশন তৈরি করার পর, এর বিভিন্ন রাউট, মডেল, এবং কন্ট্রোলারগুলোকে unit tests দিয়ে যাচাই করা গুরুত্বপূর্ণ।

ExpressJS অ্যাপ্লিকেশনটির unit testing সাধারণত Mocha, Chai, এবং Supertest এর মতো টুলস ব্যবহার করে করা হয়। Mocha একটি টেস্ট ফ্রেমওয়ার্ক, Chai একটি assertion লাইব্রেরি, এবং Supertest HTTP assertion জন্য ব্যবহার করা হয়।


১. Unit Testing এর জন্য প্রয়োজনীয় টুলস ইনস্টল করা

Unit testing শুরু করার আগে, প্রথমে কিছু টেস্টিং লাইব্রেরি ইনস্টল করতে হবে:

npm install mocha chai supertest --save-dev
  • Mocha: টেস্ট রান করার জন্য।
  • Chai: assertion লাইব্রেরি যা টেস্টের ফলাফল যাচাই করতে সাহায্য করে।
  • Supertest: HTTP request এর জন্য ব্যবহৃত হয়, যা Express অ্যাপ্লিকেশনকে টেস্ট করতে সাহায্য করে।

২. Unit Testing এর জন্য টেস্ট ফাইল তৈরি করা

ExpressJS অ্যাপ্লিকেশন টেস্ট করার জন্য একটি আলাদা টেস্ট ফাইল তৈরি করতে হবে। সাধারণত, test নামে একটি ফোল্ডার তৈরি করা হয় এবং তার মধ্যে টেস্ট ফাইল রাখা হয়। এখানে আমরা একটি সাধারণ Express অ্যাপ্লিকেশনের জন্য unit test তৈরি করব।

ধরা যাক, আমাদের একটি সহজ Express অ্যাপ্লিকেশন আছে:

// app.js
const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.status(200).send('Hello World');
});

app.get('/user/:id', (req, res) => {
  const userId = req.params.id;
  res.status(200).send(`User ID: ${userId}`);
});

module.exports = app;

এখন, আমরা এই অ্যাপ্লিকেশনটির জন্য unit test তৈরি করব।


৩. Unit Test কোড লেখা

৩.১. Mocha, Chai, এবং Supertest ব্যবহার করে টেস্ট ফাইল তৈরি করা

// test/app.test.js
const request = require('supertest');
const app = require('../app');  // Express অ্যাপ্লিকেশনটি ইম্পোর্ট করা

const { expect } = require('chai');

describe('Express App Tests', () => {

  // "/" রাউট টেস্ট করা
  it('should return status 200 and "Hello World" for GET /', (done) => {
    request(app)
      .get('/')  // "/" রাউটের জন্য GET রিকোয়েস্ট
      .expect(200)  // স্ট্যাটাস কোড 200 আশা করা
      .end((err, res) => {
        expect(res.text).to.equal('Hello World');  // রেসপন্স টেক্সট চেক করা
        done();  // টেস্টের শেষে done কল করা
      });
  });

  // "/user/:id" রাউট টেস্ট করা
  it('should return status 200 and user ID for GET /user/:id', (done) => {
    request(app)
      .get('/user/123')  // "/user/123" রাউটের জন্য GET রিকোয়েস্ট
      .expect(200)  // স্ট্যাটাস কোড 200 আশা করা
      .end((err, res) => {
        expect(res.text).to.equal('User ID: 123');  // রেসপন্স টেক্সট চেক করা
        done();  // টেস্টের শেষে done কল করা
      });
  });

});

এখানে:

  • আমরা Supertest ব্যবহার করে Express অ্যাপ্লিকেশনটি টেস্ট করি।
  • Chai এর expect ফাংশন ব্যবহার করে রেসপন্স যাচাই করা হয়, যেমন রেসপন্স টেক্সট বা স্ট্যাটাস কোড।
  • done() কল করা হয় টেস্ট সম্পন্ন হলে Mocha কে জানাতে।

৩.২. টেস্ট রান করা

আপনার package.json ফাইলে একটি "test" স্ক্রিপ্ট যোগ করুন, যাতে Mocha টেস্ট রান করতে পারে।

{
  "scripts": {
    "test": "mocha --exit"
  }
}

এখন, টেস্ট রান করতে নিচের কমান্ড ব্যবহার করুন:

npm test

এটি Mocha টেস্ট রান করবে এবং টেস্টের ফলাফল শো করবে।


৪. ExpressJS অ্যাপ্লিকেশন এর মডেল ও কন্ট্রোলার টেস্ট করা

Express অ্যাপ্লিকেশনগুলি সাধারণত controllers, services, এবং models নিয়ে কাজ করে। এসব মডিউলের ইউনিট টেস্টও করা যেতে পারে। নিচে একটি কন্ট্রোলার টেস্টের উদাহরণ দেওয়া হলো।

৪.১. কন্ট্রোলার টেস্ট উদাহরণ

ধরা যাক, আমাদের একটি userController.js ফাইল আছে, যা একটি ব্যবহারকারীর তথ্য ফেরত দেয়।

// controllers/userController.js
const getUser = (req, res) => {
  const userId = req.params.id;
  res.status(200).json({ userId });
};

module.exports = { getUser };

এখন আমরা এই কন্ট্রোলারের জন্য টেস্ট লিখব।

// test/userController.test.js
const { expect } = require('chai');
const sinon = require('sinon');
const { getUser } = require('../controllers/userController');

describe('User Controller Tests', () => {
  it('should return userId in response', () => {
    const req = { params: { id: '123' } };
    const res = {
      status: sinon.stub().returnsThis(),
      json: sinon.spy(),
    };

    getUser(req, res);

    // টেস্ট চেক: status 200 এবং json কল করা হয়েছে কিনা
    expect(res.status.calledWith(200)).to.be.true;
    expect(res.json.calledWith({ userId: '123' })).to.be.true;
  });
});

এখানে:

  • sinon ব্যবহার করে মক (mock) এবং স্পাই (spy) তৈরি করা হয়েছে।
  • res.status() এবং res.json() কলগুলো মক করা হয়েছে এবং সেগুলোর কল হওয়ার বিষয়টি যাচাই করা হয়েছে।

৫. Mocking Database Calls (ডাটাবেস কল মক করা)

অধিকাংশ অ্যাপ্লিকেশনে ডাটাবেসের সাথে ইন্টারঅ্যাকশন করতে হয়। ExpressJS অ্যাপ্লিকেশনের ইউনিট টেস্টের সময়, ডাটাবেস কলগুলো মক করা হয় যাতে টেস্ট শুধুমাত্র কন্ট্রোলার লজিক বা রাউট লজিক পরীক্ষা করে।

৫.১. Database Call মক করা উদাহরণ

ধরা যাক, আমাদের একটি userService.js আছে যা ডাটাবেসে ইউজারের তথ্য ফেরত দেয়।

// services/userService.js
const getUserFromDb = (id) => {
  // এখানে আমরা ডাটাবেসের সাথে যোগাযোগ করছি
  return { userId: id, username: 'john' }; 
};

module.exports = { getUserFromDb };

এখন, আমরা এই সার্ভিসের জন্য টেস্ট লিখব এবং ডাটাবেস কল মক করব।

// test/userService.test.js
const { expect } = require('chai');
const sinon = require('sinon');
const { getUserFromDb } = require('../services/userService');

describe('User Service Tests', () => {
  it('should return user object', () => {
    // মক ডাটাবেস কল
    const mockDbCall = sinon.stub().returns({ userId: '123', username: 'john' });
    
    const result = mockDbCall('123');
    
    // টেস্ট চেক
    expect(result).to.deep.equal({ userId: '123', username: 'john' });
  });
});

এখানে:

  • sinon.stub() ব্যবহার করে ডাটাবেস কল মক করা হয়েছে এবং সেটির রিটার্ন ভ্যালু চেক করা হয়েছে।

সারাংশ

ExpressJS অ্যাপ্লিকেশনের unit testing অত্যন্ত গুরুত্বপূর্ণ এবং এটি Mocha, Chai, এবং Supertest এর মতো টুলস ব্যবহার করে কার্যকরভাবে করা যায়। Mocha টেস্ট রানার হিসেবে কাজ করে, Chai assertion এর জন্য এবং Supertest HTTP রিকোয়েস্ট এবং রেসপন্স টেস্ট করার জন্য ব্যবহৃত হয়। টেস্টিংয়ের মাধ্যমে আপনি অ্যাপ্লিকেশনটির রাউট, কন্ট্রোলার, সার্ভিস এবং ডাটাবেস কলগুলো নিশ্চিত করতে পারেন যে সেগুলি সঠিকভাবে কাজ করছে।

Content added By

Mocha এবং Chai হল জনপ্রিয় JavaScript টেস্টিং ফ্রেমওয়ার্ক, যা Node.js এবং ExpressJS অ্যাপ্লিকেশনের জন্য টেস্টিং ব্যবহৃত হয়। Mocha টেস্ট রানার হিসেবে কাজ করে, এবং Chai একটি assertion লাইব্রেরি হিসেবে ব্যবহার করা হয়, যা টেস্টিংয়ের জন্য assertions (যেমন, assert.equal() বা expect() ) প্রদান করে।

ExpressJS অ্যাপ্লিকেশনের জন্য Mocha এবং Chai ব্যবহার করে টেস্টিং করার মাধ্যমে আপনি নিশ্চিত হতে পারেন যে, আপনার API এবং রাউটগুলো ঠিকভাবে কাজ করছে।


Mocha এবং Chai ইনস্টলেশন

প্রথমে, Mocha এবং Chai ইনস্টল করতে হবে। আপনার ExpressJS প্রজেক্টের ডিরেক্টরিতে গিয়ে নিচের কমান্ডটি রান করুন:

npm install --save-dev mocha chai supertest
  • Mocha: টেস্ট রানার হিসেবে ব্যবহৃত হয়।
  • Chai: Assertion library, যা টেস্টে ব্যবহার হয়।
  • Supertest: HTTP assertion লাইব্রেরি, যা API রিকোয়েস্ট টেস্ট করতে ব্যবহৃত হয়।

Mocha এবং Chai দিয়ে টেস্ট কনফিগারেশন

১. টেস্ট ফোল্ডার তৈরি করা

প্রথমে আপনার প্রজেক্টে একটি টেস্ট ফোল্ডার তৈরি করুন:

my-express-app/
├── app.js                   # Express অ্যাপ্লিকেশন
├── test/                    # টেস্ট ফোল্ডার
│   └── app.test.js          # টেস্ট ফাইল
├── package.json             # প্যাকেজ কনফিগারেশন
└── package-lock.json        # নির্দিষ্ট সংস্করণে প্যাকেজের ডিপেনডেন্সি

২. Express অ্যাপ্লিকেশন তৈরি করা

এখন, আপনার app.js ফাইলটি তৈরি করুন যদি না থাকে, এবং এখানে কিছু সহজ রাউট তৈরি করুন।

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.status(200).send('Hello, world!');
});

app.get('/api/user', (req, res) => {
  res.status(200).json({ id: 1, name: 'John Doe' });
});

app.listen(port, () => {
  console.log(`Server running at http://localhost:${port}`);
});

module.exports = app;  // Exporting app for testing purposes

এখানে দুটি রাউট তৈরি করা হয়েছে:

  1. /: একটি সাধারণ গেট রাউট যা 'Hello, world!' বার্তা রিটার্ন করবে।
  2. /api/user: একটি API রাউট যা ইউজারের তথ্য JSON আকারে রিটার্ন করবে।

৩. টেস্ট ফাইল তৈরি করা

এখন, test/app.test.js ফাইলে টেস্ট কেসগুলো তৈরি করা হবে।

const request = require('supertest');
const app = require('../app');  // Import the app to test
const chai = require('chai');
const expect = chai.expect;

describe('ExpressJS API Testing', function() {

  it('should return status 200 for the home route', function(done) {
    request(app)
      .get('/')
      .expect(200)
      .end(function(err, res) {
        if (err) return done(err);
        expect(res.text).to.equal('Hello, world!');
        done();
      });
  });

  it('should return user data for /api/user route', function(done) {
    request(app)
      .get('/api/user')
      .expect(200)
      .end(function(err, res) {
        if (err) return done(err);
        expect(res.body).to.have.property('id');
        expect(res.body.id).to.equal(1);
        expect(res.body).to.have.property('name');
        expect(res.body.name).to.equal('John Doe');
        done();
      });
  });

});

এখানে:

  • describe(): একটি টেস্ট স্যুট, যেখানে আমরা একাধিক টেস্ট কেস গ룹 করতে পারি।
  • it(): প্রতিটি টেস্ট কেসের জন্য ব্লক।
  • request(app): Supertest ব্যবহার করে Express অ্যাপ্লিকেশনের সাথে HTTP রিকোয়েস্ট করা।
  • expect(): Chai assertion লাইব্রেরি দিয়ে রেসপন্সের ডেটা যাচাই করা।

৪. Mocha রান কনফিগার করা

আপনার package.json ফাইলে Mocha টেস্ট রানার কনফিগার করুন। test স্ক্রিপ্টের মধ্যে Mocha রান করানোর জন্য এই কোডটি যুক্ত করুন:

"scripts": {
  "test": "mocha"
}

এখন, আপনি টেস্ট চালানোর জন্য নিচের কমান্ডটি ব্যবহার করতে পারবেন:

npm test

টেস্ট রান এবং ফলাফল

এখন, আপনি npm test চালালে Mocha সমস্ত টেস্ট কেস রান করবে এবং ফলাফল দেখাবে। যদি সবকিছু সঠিকভাবে কাজ করে, আপনি নিম্নলিখিত ফলাফল দেখতে পাবেন:

ExpressJS API Testing
    ✓ should return status 200 for the home route
    ✓ should return user data for /api/user route

  2 passing (50ms)

এখানে:

  • প্রথম টেস্ট কেস / রাউটটি 200 স্ট্যাটাস কোড রিটার্ন করেছে এবং "Hello, world!" বার্তা পাঠিয়েছে।
  • দ্বিতীয় টেস্ট কেস /api/user রাউট থেকে সঠিক ইউজার ডেটা ফিরে এসেছে।

Mocha এবং Chai এর অন্যান্য ফিচার

  1. Before/After Hooks: টেস্টের আগে বা পরে কিছু কোড রান করানোর জন্য before(), after() ব্যবহার করা যেতে পারে।

    উদাহরণ:

    before(function() {
      // Runs before any tests
      console.log('Before tests');
    });
    
    after(function() {
      // Runs after all tests
      console.log('After tests');
    });
    
  2. Asynchronous Testing: যদি কোনো টেস্ট অ্যাসিনক্রোনাস হয়, তবে done() কলব্যাক ফাংশন ব্যবহার করতে হয়, যাতে Mocha বুঝতে পারে টেস্টটি শেষ হওয়ার আগে অপেক্ষা করতে হবে।

সারাংশ

Mocha এবং Chai ব্যবহার করে ExpressJS অ্যাপ্লিকেশন টেস্টিং করা একটি শক্তিশালী পদ্ধতি। Mocha টেস্ট রানার এবং Chai assertion লাইব্রেরি ব্যবহার করে আপনি সহজে API রাউট, কনট্রোলার এবং অন্যান্য ফাংশনালিটি পরীক্ষা করতে পারেন। Supertest ব্যবহার করে HTTP রিকোয়েস্ট পাঠানো হয় এবং রেসপন্স যাচাই করা হয়। এই পদ্ধতিটি আপনার অ্যাপ্লিকেশন ডেভেলপমেন্ট প্রক্রিয়ায় একটি উন্নত টেস্টিং স্তর যোগ করে এবং বাগ শনাক্তকরণে সহায়তা করে।

Content added By

Supertest হল একটি JavaScript লাইব্রেরি যা Node.js অ্যাপ্লিকেশনগুলির জন্য HTTP assertions এবং API টেস্টিং পরিচালনা করতে ব্যবহৃত হয়। এটি ExpressJS অ্যাপ্লিকেশনগুলির জন্য অত্যন্ত উপকারী, কারণ এটি সহজে HTTP রিকোয়েস্ট পাঠাতে এবং তাদের রেসপন্স পরীক্ষা করতে সক্ষম। Supertest সাধারণত Jest বা Mocha এর সাথে একত্রে ব্যবহৃত হয়, যাতে অ্যাপ্লিকেশনের API সঠিকভাবে কাজ করছে কিনা তা নিশ্চিত করা যায়।

এই গাইডে, আমরা ExpressJS অ্যাপ্লিকেশনে Supertest ব্যবহার করে API টেস্টিং কিভাবে করা যায় তা দেখাব।


১. Supertest কি এবং কেন ব্যবহার করবেন?

Supertest একটি অত্যন্ত জনপ্রিয় লাইব্রেরি যা HTTP রিকোয়েস্ট পাঠানোর জন্য ব্যবহৃত হয়। এটি সাধারণত API টেস্টিংয়ে ব্যবহার হয়, কারণ এটি সহজে HTTP রিকোয়েস্ট পাঠিয়ে সার্ভারের রেসপন্স পরীক্ষা করতে সাহায্য করে। Supertest দিয়ে আপনি HTTP মেথড (GET, POST, PUT, DELETE) পরীক্ষা করতে পারেন, রেসপন্স স্ট্যাটাস কোড, রেসপন্স বডি, হেডার ইত্যাদি যাচাই করতে পারেন।


২. Supertest ইনস্টলেশন

প্রথমে, Supertest এবং Mocha (বা যে কোনো টেস্টিং ফ্রেমওয়ার্ক) ইনস্টল করতে হবে।

npm install --save-dev supertest mocha
  • supertest: API টেস্টিংয়ের জন্য।
  • mocha: টেস্ট রানার হিসাবে।

৩. ExpressJS অ্যাপ্লিকেশন তৈরি করা

আমরা একটি সিম্পল ExpressJS অ্যাপ্লিকেশন তৈরি করব এবং তাতে API রাউট যোগ করব, যা আমরা Supertest দিয়ে টেস্ট করব।

app.js (Express অ্যাপ্লিকেশন)

const express = require('express');
const app = express();
const port = 3000;

// স্ট্যাটিক JSON ডেটা
const users = [
  { id: 1, name: 'John Doe', email: 'john@example.com' },
  { id: 2, name: 'Jane Doe', email: 'jane@example.com' }
];

// GET রাউট: সমস্ত ইউজার পেতে
app.get('/users', (req, res) => {
  res.status(200).json(users);
});

// GET রাউট: নির্দিষ্ট ইউজার পেতে (ID অনুযায়ী)
app.get('/users/:id', (req, res) => {
  const user = users.find(u => u.id === parseInt(req.params.id));
  if (!user) {
    return res.status(404).json({ message: 'User not found' });
  }
  res.status(200).json(user);
});

// POST রাউট: নতুন ইউজার তৈরি করা
app.post('/users', express.json(), (req, res) => {
  const { name, email } = req.body;
  const newUser = { id: users.length + 1, name, email };
  users.push(newUser);
  res.status(201).json(newUser);
});

// PUT রাউট: ইউজার আপডেট করা
app.put('/users/:id', express.json(), (req, res) => {
  const { name, email } = req.body;
  const user = users.find(u => u.id === parseInt(req.params.id));
  if (!user) {
    return res.status(404).json({ message: 'User not found' });
  }
  user.name = name;
  user.email = email;
  res.status(200).json(user);
});

// DELETE রাউট: ইউজার মুছে ফেলা
app.delete('/users/:id', (req, res) => {
  const userIndex = users.findIndex(u => u.id === parseInt(req.params.id));
  if (userIndex === -1) {
    return res.status(404).json({ message: 'User not found' });
  }
  users.splice(userIndex, 1);
  res.status(204).send(); // 204: No Content
});

// সার্ভার শুরু
app.listen(port, () => {
  console.log(`Server running at http://localhost:${port}`);
});

module.exports = app;

এখানে আমরা কিছু সাধারণ API রাউট তৈরি করেছি:

  • GET /users: সমস্ত ইউজার রিটার্ন করবে।
  • GET /users/:id: নির্দিষ্ট ইউজার ID দিয়ে ডেটা রিটার্ন করবে।
  • POST /users: নতুন ইউজার তৈরি করবে।
  • PUT /users/:id: ইউজারের তথ্য আপডেট করবে।
  • DELETE /users/:id: ইউজার মুছে ফেলবে।

৪. Supertest দিয়ে API টেস্টিং করা

এখন, Supertest দিয়ে আমরা API টেস্টিং শুরু করব। টেস্টগুলো চালানোর জন্য Mocha ব্যবহার করব।

test/api.test.js (টেস্ট ফাইল)

const request = require('supertest');
const app = require('../app'); // Express অ্যাপ্লিকেশন

describe('API Test', () => {

  // GET /users রাউট টেস্ট
  it('should return all users', async () => {
    const response = await request(app).get('/users');
    expect(response.status).toBe(200);  // HTTP Status code check
    expect(response.body).toHaveLength(2); // Users count check
    expect(response.body[0].name).toBe('John Doe'); // First user name check
  });

  // GET /users/:id রাউট টেস্ট
  it('should return a single user by ID', async () => {
    const response = await request(app).get('/users/1');
    expect(response.status).toBe(200);
    expect(response.body.name).toBe('John Doe');
  });

  // POST /users রাউট টেস্ট
  it('should create a new user', async () => {
    const newUser = {
      name: 'Alice',
      email: 'alice@example.com'
    };
    const response = await request(app).post('/users').send(newUser);
    expect(response.status).toBe(201);
    expect(response.body.name).toBe('Alice');
    expect(response.body.email).toBe('alice@example.com');
  });

  // PUT /users/:id রাউট টেস্ট
  it('should update an existing user', async () => {
    const updatedUser = {
      name: 'John Updated',
      email: 'john.updated@example.com'
    };
    const response = await request(app).put('/users/1').send(updatedUser);
    expect(response.status).toBe(200);
    expect(response.body.name).toBe('John Updated');
    expect(response.body.email).toBe('john.updated@example.com');
  });

  // DELETE /users/:id রাউট টেস্ট
  it('should delete a user', async () => {
    const response = await request(app).delete('/users/2');
    expect(response.status).toBe(204);
  });

});

এখানে:

  • request(app): Express অ্যাপ্লিকেশন থেকে HTTP রিকোয়েস্ট পাঠানোর জন্য Supertest এর request ফাংশন ব্যবহার করা হয়েছে।
  • it(): Mocha এর টেস্ট কেস হিসেবে ব্যবহৃত ফাংশন, যেখানে প্রত্যাশিত আউটপুট দিয়ে রেসপন্স যাচাই করা হয়।
  • expect(): রেসপন্স যাচাই করার জন্য ব্যবহার করা হয়, যেমন স্ট্যাটাস কোড, রেসপন্স বডি ইত্যাদি।

৫. টেস্ট চালানো

এখন, আমরা Mocha এর মাধ্যমে টেস্টগুলো চালাতে পারি।

npx mocha test/api.test.js

এই কমান্ডটি চালানোর পর আপনি টেস্টের ফলাফল দেখতে পারবেন।


Supertest একটি শক্তিশালী লাইব্রেরি যা ExpressJS অ্যাপ্লিকেশনগুলির জন্য API টেস্টিং করা সহজ করে তোলে। এটি HTTP রিকোয়েস্ট পাঠানোর জন্য ব্যবহৃত হয় এবং রেসপন্সে প্রাপ্ত ডেটা যাচাই করার জন্য অনেক সুবিধা প্রদান করে। Mocha এর সাথে ব্যবহার করলে আপনি সহজেই আপনার API এর কার্যকারিতা পরীক্ষা করতে পারেন।

এই গাইডে, আমরা দেখেছি কিভাবে ExpressJS অ্যাপ্লিকেশন তৈরি করা যায় এবং তার উপর Supertest দিয়ে API টেস্টিং করা যায়।

Content added By

Continuous Integration (CI) এবং Automated Testing মডার্ন সফটওয়্যার ডেভেলপমেন্টের গুরুত্বপূর্ণ অংশ। এই দুটি পদ্ধতি আপনার কোডের গুণমান নিশ্চিত করতে এবং দ্রুত এবং কার্যকরীভাবে ডিপ্লয়মেন্ট প্রক্রিয়া পরিচালনা করতে সাহায্য করে। ExpressJS অ্যাপ্লিকেশনেও CI এবং Automated Testing ব্যবহার করা যেতে পারে, যাতে কোড পরিবর্তন দ্রুত পরীক্ষা করা যায় এবং কোডের কোনো সমস্যা থাকলে তা তৎক্ষণাত শনাক্ত করা যায়।


Continuous Integration (CI) কি?

Continuous Integration (CI) হল একটি সফটওয়্যার ডেভেলপমেন্ট প্র্যাকটিস যেখানে কোডের পরিবর্তনগুলি নিয়মিতভাবে মূল ব্রাঞ্চে (যেমন, main বা master) মার্জ করা হয়। এতে করে প্রতিটি কোড আপডেট বা ফিচার ডেভেলপমেন্টের পর তা স্বয়ংক্রিয়ভাবে টেস্ট করা হয়। CI পদ্ধতির মাধ্যমে কোডের সাথে সম্পর্কিত কোনো সমস্যা, বাগ বা ত্রুটি দ্রুত ধরা পড়ে।


Automated Testing কি?

Automated Testing হল একটি প্রক্রিয়া যেখানে কোডের কার্যকারিতা পরীক্ষা করার জন্য সফটওয়্যার টুল বা স্ক্রিপ্ট ব্যবহার করা হয়, যাতে মানুষের উপস্থিতির প্রয়োজন না পড়ে। এই ধরনের টেস্টিং কোডের নির্দিষ্ট অংশ যেমন ফাংশন, ফিচার, বা রাউট টেস্ট করে এবং কোডের গুণমান ও স্থিতিশীলতা নিশ্চিত করে।

Automated Testing বেশ কয়েকটি ধরনের হতে পারে:

  1. Unit Testing: কোডের একক ফাংশন বা মডিউল পরীক্ষা করা।
  2. Integration Testing: বিভিন্ন সিস্টেম বা মডিউলের মধ্যে ইন্টারঅ্যাকশন পরীক্ষা করা।
  3. End-to-End Testing: অ্যাপ্লিকেশন বা সিস্টেমের পূর্ণ কার্যকারিতা পরীক্ষা করা।

ExpressJS অ্যাপে CI এবং Automated Testing কনফিগার করা

এখন, ExpressJS অ্যাপ্লিকেশনে Continuous Integration এবং Automated Testing কনফিগার করতে কিছু প্রয়োজনীয় স্টেপ অনুসরণ করা হবে।

১. Automated Testing সেটআপ করা

ExpressJS অ্যাপ্লিকেশনে Automated Testing করতে আমরা সাধারণত Mocha এবং Chai নামক টেস্টিং ফ্রেমওয়ার্ক দুটি ব্যবহার করি।

  1. Mocha: একটি হালকা, বেসিক টেস্টিং ফ্রেমওয়ার্ক যা অ্যাসিঙ্ক্রোনাস টেস্টিং সাপোর্ট করে।
  2. Chai: একটি Assertion লাইব্রেরি যা Mocha-এর সাথে কাজ করে।
১.১. Mocha এবং Chai ইনস্টল করা
npm install --save-dev mocha chai
১.২. Test ফোল্ডার তৈরি করা
myapp/
  ├── test/
      ├── app.test.js
১.৩. Basic Test লিখা

এখন, আমরা Mocha এবং Chai ব্যবহার করে একটি বেসিক টেস্ট লিখব যা ExpressJS অ্যাপ্লিকেশনের একটি রাউট চেক করবে।

test/app.test.js:

const chai = require('chai');
const chaiHttp = require('chai-http');
const app = require('../app');  // আপনার Express অ্যাপ

chai.should();
chai.use(chaiHttp);

describe("GET /", () => {
  it("It should return a message", (done) => {
    chai.request(app)
      .get('/')
      .end((err, res) => {
        res.should.have.status(200);
        res.body.should.have.property('message').eq('Hello, World!');
        done();
      });
  });
});

এখানে:

  • আমরা Chai HTTP ব্যবহার করছি API রিকোয়েস্ট করার জন্য।
  • GET / রাউট চেক করা হয়েছে যে, এটি 200 স্ট্যাটাস কোড এবং সঠিক মেসেজ প্রদান করে কিনা।
১.৪. Test স্ক্রিপ্ট রান করা

আপনার package.json ফাইলের মধ্যে টেস্ট স্ক্রিপ্ট যোগ করুন:

{
  "scripts": {
    "test": "mocha"
  }
}

এখন আপনি npm test কমান্ড চালিয়ে টেস্ট রান করতে পারবেন।

npm test

২. Continuous Integration (CI) সেটআপ করা

Continuous Integration ব্যবহারের জন্য আমাদের প্রথমে একটি CI/CD টুল সেটআপ করতে হবে। এখানে আমরা GitHub Actions ব্যবহার করব, যা একটি জনপ্রিয় CI/CD টুল এবং GitHub রিপোজিটরির সাথে ইন্টিগ্রেট করা যায়।

২.১. GitHub Actions কনফিগার করা

GitHub Actions কনফিগার করতে, আপনাকে আপনার প্রজেক্টের .github/workflows ডিরেক্টরিতে একটি workflow ফাইল তৈরি করতে হবে। উদাহরণস্বরূপ, ci.yml ফাইলটি।

myapp/
  ├── .github/
      ├── workflows/
          ├── ci.yml

২.২. GitHub Actions Workflow তৈরি করা

ci.yml ফাইলটি এরকম হবে:

name: Node.js CI

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Set up Node.js
        uses: actions/setup-node@v2
        with:
          node-version: '14'

      - name: Install dependencies
        run: npm install

      - name: Run tests
        run: npm test

এই CI workflow ফাইলটি GitHub রিপোজিটরিতে প্রতি পুশ এবং পুল রিকোয়েস্টের পর কোড টেস্ট করবে।

  • actions/checkout@v2: রিপোজিটরি চেকআউট করবে।
  • actions/setup-node@v2: নির্দিষ্ট Node.js ভার্সন সেট করবে।
  • npm install: ডিপেন্ডেন্সি ইনস্টল করবে।
  • npm test: Mocha টেস্ট রান করবে।

২.৩. GitHub Actions চালানো

এই ফাইলটি রিপোজিটরিতে পুশ করার পর, GitHub Actions অটোমেটিক্যালি আপনার কোডে CI টেস্ট চালাবে। আপনি GitHub-এর Actions ট্যাবে টেস্ট রেজাল্ট দেখতে পারবেন।


CI এবং Automated Testing এর উপকারিতা

  • Code Quality Improvement: অটোমেটেড টেস্টিং কোডের গুণমান বজায় রাখতে সাহায্য করে, বাগ বা ত্রুটি শণাক্ত করা সহজ হয়।
  • Faster Development Cycle: Continuous Integration-এর মাধ্যমে কোড চেকিং এবং ডিপ্লয়মেন্ট দ্রুত করা যায়, যা উন্নয়ন প্রক্রিয়াকে ত্বরান্বিত করে।
  • Error Detection: টেস্টিং পদ্ধতিগুলি কোডে সম্ভাব্য বাগ বা সমস্যা আগে শনাক্ত করতে সাহায্য করে।
  • Seamless Deployment: CI/CD পদ্ধতির মাধ্যমে ডিপ্লয়মেন্ট প্রক্রিয়া অটোমেটিক্যালি সিম্পল এবং দ্রুত হয়ে যায়।

সারাংশ

ExpressJS অ্যাপ্লিকেশনে Continuous Integration (CI) এবং Automated Testing কনফিগার করা অত্যন্ত গুরুত্বপূর্ণ। Mocha এবং Chai টুলস ব্যবহার করে আমরা Automated Testing সেটআপ করতে পারি, এবং GitHub Actions ব্যবহার করে CI/CD সিস্টেম তৈরি করতে পারি। এই পদ্ধতিগুলি কোডের গুণমান উন্নত করতে, ত্রুটি শণাক্ত করতে, এবং দ্রুত ডিপ্লয়মেন্ট প্রক্রিয়া নিশ্চিত করতে সাহায্য করে।

Content added By
Promotion

Are you sure to start over?

Loading...