Unit Testing ExpressJS অ্যাপ্লিকেশন

Testing এবং TDD (Test-Driven Development) - এক্সপ্রেসজেএস (ExpressJS) - Web Development

247

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
Promotion

Are you sure to start over?

Loading...