Unit Testing এবং Integration Testing এর জন্য Setup

Testing এবং Debugging TypeORM অ্যাপ্লিকেশন - টাইপওআরএম (TypeORM) - Web Development

335

Unit Testing এবং Integration Testing: একটি পরিচিতি

Unit Testing এবং Integration Testing দুটি অত্যন্ত গুরুত্বপূর্ণ টেস্টিং কৌশল যা সফটওয়্যার ডেভেলপমেন্টে কোডের গুণগত মান নিশ্চিত করতে ব্যবহৃত হয়।

  • Unit Testing: এটি কোডের একক অংশ (ফাংশন বা মেথড) টেস্ট করে। এর উদ্দেশ্য হচ্ছে নিশ্চিত করা যে, প্রতিটি ফাংশন তার নির্ধারিত কাজ সঠিকভাবে করছে।
  • Integration Testing: এটি একাধিক অংশের বা মডিউলের একত্রে কাজ পরীক্ষা করে। এর উদ্দেশ্য হচ্ছে, একাধিক সিস্টেম বা মডিউল একসাথে সঠিকভাবে কাজ করছে কি না তা যাচাই করা।

TypeORM এ Unit Testing এবং Integration Testing সেটআপ করা বেশ গুরুত্বপূর্ণ, কারণ এতে ডেটাবেস ইন্টারঅ্যাকশন, রেপোজিটরি অপারেশন, এবং সিস্টেমের বিভিন্ন অংশ পরীক্ষা করা সহজ হয়।


Unit Testing এবং Integration Testing এর জন্য Setup

TypeORM এর জন্য Unit Testing এবং Integration Testing সেটআপ করতে, আমরা Jest বা Mocha-এর মতো টেস্টিং ফ্রেমওয়ার্ক এবং ts-jest বা ts-node-এর মতো TypeScript সমর্থক টুলস ব্যবহার করব। নিচে একটি সাধারণ Jest এবং TypeORM এর জন্য টেস্ট সেটআপের উদাহরণ দেওয়া হয়েছে।


১. Jest ইনস্টলেশন এবং সেটআপ

Jest হলো একটি জনপ্রিয় টেস্টিং ফ্রেমওয়ার্ক যা দ্রুত এবং সহজে Unit Testing এবং Integration Testing পরিচালনা করতে সাহায্য করে। TypeORM-এর সাথে Jest ব্যবহার করার জন্য প্রথমে প্রয়োজনীয় প্যাকেজগুলো ইনস্টল করতে হবে।

Jest ইনস্টল করা:

npm install --save-dev jest ts-jest @types/jest
  • jest: Jest টেস্টিং ফ্রেমওয়ার্ক।
  • ts-jest: TypeScript ফাইলগুলি Jest দ্বারা রান করার জন্য একটি টুল।
  • @types/jest: Jest এর জন্য TypeScript টাইপ ডিফিনিশন।

Jest কনফিগারেশন:

Jest সেটআপ করার জন্য একটি jest.config.js ফাইল তৈরি করুন।

module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'node',
  transform: {
    '^.+\\.ts$': 'ts-jest',
  },
  moduleFileExtensions: ['ts', 'js', 'json', 'node'],
  testPathIgnorePatterns: ['/node_modules/', '/dist/'],
};

এই কনফিগারেশনটি TypeScript ফাইল রান করার জন্য ts-jest ব্যবহার করবে এবং node.js পরিবেশে টেস্ট চলবে।


২. TypeORM Setup for Testing

টেস্টিং এর জন্য, আপনি in-memory database বা mock database ব্যবহার করতে পারেন, যেমন SQLite। এতে মূল ডেটাবেসের পরিবর্তে একটি দ্রুত ও সহজ ডেটাবেস তৈরি হবে যা টেস্ট চলাকালীন ব্যবহার করা হবে।

Testing Database Setup (SQLite):

import { createConnection } from "typeorm";

createConnection({
  type: "sqlite",
  database: ":memory:",
  entities: [User],
  synchronize: true,  // synchronize: true ensures that the schema is created automatically
}).then(() => {
  console.log('In-memory database connected for testing.');
});

এখানে, SQLite ব্যবহার করা হয়েছে যা ইন-মেমরি ডেটাবেস হিসাবে কাজ করবে এবং টেস্টিংয়ের জন্য সহজে ডেটাবেস তৈরি করবে।


৩. Unit Test উদাহরণ

Unit Testing-এ আমরা একক ফাংশনের কার্যকারিতা পরীক্ষা করি। নিচে একটি TypeORM রেপোজিটরি ফাংশনের জন্য Unit Test করার উদাহরণ দেওয়া হলো।

User Entity:

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  email: string;
}

Test: UserRepository:

import { createConnection, getRepository } from "typeorm";
import { User } from "./User";
import { Connection } from "typeorm";
import { Repository } from "typeorm";

describe('User Repository Tests', () => {
  let connection: Connection;
  let userRepository: Repository<User>;

  beforeAll(async () => {
    connection = await createConnection({
      type: "sqlite",
      database: ":memory:",
      entities: [User],
      synchronize: true,
    });
    userRepository = connection.getRepository(User);
  });

  afterAll(async () => {
    await connection.close();
  });

  it('should save a user', async () => {
    const user = new User();
    user.name = 'John Doe';
    user.email = 'john@example.com';

    const savedUser = await userRepository.save(user);
    
    expect(savedUser.name).toBe('John Doe');
    expect(savedUser.email).toBe('john@example.com');
  });

  it('should find a user by id', async () => {
    const user = new User();
    user.name = 'Jane Doe';
    user.email = 'jane@example.com';

    const savedUser = await userRepository.save(user);

    const foundUser = await userRepository.findOne(savedUser.id);

    expect(foundUser).not.toBeNull();
    expect(foundUser!.name).toBe('Jane Doe');
  });
});

এখানে, beforeAll-এ আমরা ইন-মেমরি SQLite ডেটাবেসের সাথে সংযোগ করছি এবং User টেবিল তৈরি করছি। পরে it ব্লকগুলিতে বিভিন্ন CRUD অপারেশন যাচাই করা হচ্ছে।


৪. Integration Test উদাহরণ

Integration Testing-এ আমরা একাধিক মডিউল বা সিস্টেমের সংযোগ পরীক্ষা করি। TypeORM-এ Integration Testing এর জন্য আমরা সাধারণত বিভিন্ন মডেল বা সার্ভিসের সমন্বয়ে একটি পুরো সিস্টেম টেস্ট করি।

Test: Create and Find User with Post Entity:

ধরা যাক, আমাদের একটি User এবং একটি Post মডেল রয়েছে এবং আমরা যাচাই করতে চাই যে, একটি ব্যবহারকারী এবং তার পোস্ট সঠিকভাবে কাজ করছে।

import { createConnection, getRepository } from "typeorm";
import { User } from "./User";
import { Post } from "./Post";
import { Connection } from "typeorm";
import { Repository } from "typeorm";

describe('User and Post Integration Test', () => {
  let connection: Connection;
  let userRepository: Repository<User>;
  let postRepository: Repository<Post>;

  beforeAll(async () => {
    connection = await createConnection({
      type: "sqlite",
      database: ":memory:",
      entities: [User, Post],
      synchronize: true,
    });
    userRepository = connection.getRepository(User);
    postRepository = connection.getRepository(Post);
  });

  afterAll(async () => {
    await connection.close();
  });

  it('should create a user and associated posts', async () => {
    const user = new User();
    user.name = 'John Doe';
    user.email = 'john@example.com';

    const savedUser = await userRepository.save(user);

    const post1 = new Post();
    post1.title = "Post 1";
    post1.content = "Content of Post 1";
    post1.user = savedUser;

    const post2 = new Post();
    post2.title = "Post 2";
    post2.content = "Content of Post 2";
    post2.user = savedUser;

    await postRepository.save([post1, post2]);

    const userWithPosts = await userRepository.findOne(savedUser.id, { relations: ["posts"] });

    expect(userWithPosts!.posts.length).toBe(2);
    expect(userWithPosts!.posts[0].title).toBe("Post 1");
    expect(userWithPosts!.posts[1].title).toBe("Post 2");
  });
});

এখানে, User এবং Post এর মধ্যে একটি One-to-Many সম্পর্ক তৈরি করা হয়েছে এবং টেস্টে যাচাই করা হচ্ছে যে, একটি ব্যবহারকারী এবং তার সম্পর্কিত পোস্ট গুলো সঠিকভাবে ডেটাবেসে সেভ এবং লোড হচ্ছে।


সারাংশ

Unit Testing এবং Integration Testing TypeORM এর জন্য একটি গুরুত্বপূর্ণ অংশ। Jest টেস্টিং ফ্রেমওয়ার্ক ব্যবহার করে TypeORM মডেল এবং রেপোজিটরি টেস্ট করা সম্ভব। Unit Testing-এ একক ফাংশন বা মডিউল পরীক্ষা করা হয় এবং Integration Testing-এ একাধিক মডিউল একত্রে কাজ করছে কিনা তা পরীক্ষা করা হয়। TypeORM-এ ডেটাবেস অপারেশন, রিলেশন এবং CRUD ফাংশনালিটি টেস্ট করার জন্য ইন-মেমরি SQLite বা অন্যান্য ডাটাবেস ব্যবহার করা যেতে পারে।

Content added By
Promotion

Are you sure to start over?

Loading...