Tiếng Việt

Hướng dẫn toàn diện về kiểm thử tích hợp API với Supertest, bao gồm cài đặt, các phương pháp hay nhất và kỹ thuật nâng cao để kiểm thử ứng dụng mạnh mẽ.

Kiểm thử tích hợp: Làm chủ kiểm thử API với Supertest

Trong lĩnh vực phát triển phần mềm, việc đảm bảo các thành phần riêng lẻ hoạt động chính xác một cách độc lập (kiểm thử đơn vị) là rất quan trọng. Tuy nhiên, việc xác minh rằng các thành phần này hoạt động liền mạch với nhau cũng quan trọng không kém. Đây là lúc kiểm thử tích hợp phát huy vai trò. Kiểm thử tích hợp tập trung vào việc xác thực sự tương tác giữa các mô-đun hoặc dịch vụ khác nhau trong một ứng dụng. Bài viết này sẽ đi sâu vào kiểm thử tích hợp, đặc biệt tập trung vào kiểm thử API với Supertest, một thư viện mạnh mẽ và thân thiện với người dùng để kiểm thử các xác nhận HTTP trong Node.js.

Kiểm thử tích hợp là gì?

Kiểm thử tích hợp là một loại kiểm thử phần mềm kết hợp các mô-đun phần mềm riêng lẻ và kiểm thử chúng như một nhóm. Nó nhằm mục đích phát hiện các khiếm khuyết trong sự tương tác giữa các đơn vị được tích hợp. Không giống như kiểm thử đơn vị, vốn tập trung vào các thành phần riêng lẻ, kiểm thử tích hợp xác minh luồng dữ liệu và luồng điều khiển giữa các mô-đun. Các phương pháp kiểm thử tích hợp phổ biến bao gồm:

Trong bối cảnh API, kiểm thử tích hợp bao gồm việc xác minh rằng các API khác nhau hoạt động chính xác với nhau, rằng dữ liệu được truyền giữa chúng là nhất quán, và hệ thống tổng thể hoạt động như mong đợi. Ví dụ, hãy tưởng tượng một ứng dụng thương mại điện tử với các API riêng biệt cho quản lý sản phẩm, xác thực người dùng và xử lý thanh toán. Kiểm thử tích hợp sẽ đảm bảo rằng các API này giao tiếp chính xác, cho phép người dùng duyệt sản phẩm, đăng nhập an toàn và hoàn tất giao dịch mua hàng.

Tại sao Kiểm thử Tích hợp API lại Quan trọng?

Kiểm thử tích hợp API là rất quan trọng vì nhiều lý do:

Hãy xem xét một nền tảng đặt chỗ du lịch toàn cầu. Kiểm thử tích hợp API là tối quan trọng để đảm bảo giao tiếp trôi chảy giữa các API xử lý việc đặt vé máy bay, đặt phòng khách sạn và cổng thanh toán từ nhiều quốc gia khác nhau. Việc không tích hợp đúng cách các API này có thể dẫn đến việc đặt chỗ không chính xác, lỗi thanh toán và trải nghiệm người dùng kém, ảnh hưởng tiêu cực đến uy tín và doanh thu của nền tảng.

Giới thiệu Supertest: Một công cụ mạnh mẽ để kiểm thử API

Supertest là một lớp trừu tượng cấp cao để kiểm thử các request HTTP. Nó cung cấp một API tiện lợi và linh hoạt để gửi request đến ứng dụng của bạn và xác nhận các response. Được xây dựng trên nền tảng Node.js, Supertest được thiết kế đặc biệt để kiểm thử các máy chủ HTTP Node.js. Nó hoạt động đặc biệt tốt với các framework kiểm thử phổ biến như Jest và Mocha.

Các tính năng chính của Supertest:

Thiết lập Môi trường Kiểm thử của bạn

Trước khi bắt đầu, hãy thiết lập một môi trường kiểm thử cơ bản. Chúng tôi sẽ giả định bạn đã cài đặt Node.js và npm (hoặc yarn). Chúng tôi sẽ sử dụng Jest làm framework kiểm thử và Supertest để kiểm thử API.

  1. Tạo một dự án Node.js:
mkdir api-testing-example
cd api-testing-example
npm init -y
  1. Cài đặt các dependency:
npm install --save-dev jest supertest
npm install express  # Hoặc framework bạn ưa thích để tạo API
  1. Cấu hình Jest: Thêm đoạn sau vào tệp package.json của bạn:
{
  "scripts": {
    "test": "jest"
  }
}
  1. Tạo một API endpoint đơn giản: Tạo một tệp có tên app.js (hoặc tương tự) với đoạn mã sau:
const express = require('express');
const app = express();
const port = 3000;

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

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

module.exports = app; // Xuất ra để kiểm thử

Viết bài kiểm thử Supertest đầu tiên của bạn

Bây giờ chúng ta đã thiết lập xong môi trường, hãy viết một bài kiểm thử Supertest đơn giản để xác minh API endpoint của chúng ta. Tạo một tệp có tên app.test.js (hoặc tương tự) trong thư mục gốc của dự án của bạn:

const request = require('supertest');
const app = require('./app');

describe('GET /hello', () => {
  it('phản hồi với mã 200 OK và trả về "Hello, World!"', async () => {
    const response = await request(app).get('/hello');
    expect(response.statusCode).toBe(200);
    expect(response.text).toBe('Hello, World!');
  });
});

Giải thích:

Để chạy bài kiểm thử, hãy thực hiện lệnh sau trong terminal của bạn:

npm test

Nếu mọi thứ được thiết lập chính xác, bạn sẽ thấy bài kiểm thử vượt qua.

Các kỹ thuật Supertest nâng cao

Supertest cung cấp một loạt các tính năng để kiểm thử API nâng cao. Hãy khám phá một vài trong số chúng.

1. Gửi Request Body

Để gửi dữ liệu trong request body, bạn có thể sử dụng phương thức .send(). Ví dụ, hãy tạo một endpoint chấp nhận dữ liệu JSON:

app.post('/users', express.json(), (req, res) => {
  const { name, email } = req.body;
  // Mô phỏng việc tạo người dùng trong cơ sở dữ liệu
  const user = { id: Date.now(), name, email };
  res.status(201).json(user);
});

Đây là cách bạn có thể kiểm thử endpoint này bằng Supertest:

describe('POST /users', () => {
  it('tạo một người dùng mới', async () => {
    const userData = {
      name: 'John Doe',
      email: 'john.doe@example.com',
    };

    const response = await request(app)
      .post('/users')
      .send(userData)
      .expect(201);

    expect(response.body).toHaveProperty('id');
    expect(response.body.name).toBe(userData.name);
    expect(response.body.email).toBe(userData.email);
  });
});

Giải thích:

2. Thiết lập Header

Để thiết lập các header tùy chỉnh trong request của bạn, bạn có thể sử dụng phương thức .set(). Điều này hữu ích để thiết lập token xác thực, content type, hoặc các header tùy chỉnh khác.

describe('GET /protected', () => {
  it('yêu cầu xác thực', async () => {
    const response = await request(app).get('/protected').expect(401);
  });

  it('trả về 200 OK với một token hợp lệ', async () => {
    // Mô phỏng việc lấy một token hợp lệ
    const token = 'valid-token';

    const response = await request(app)
      .get('/protected')
      .set('Authorization', `Bearer ${token}`)
      .expect(200);

    expect(response.text).toBe('Protected Resource');
  });
});

Giải thích:

3. Xử lý Cookie

Supertest cũng có thể xử lý cookie. Bạn có thể đặt cookie bằng phương thức .set('Cookie', ...), hoặc bạn có thể sử dụng thuộc tính .cookies để truy cập và sửa đổi cookie.

4. Kiểm thử Tải lên Tệp

Supertest có thể được sử dụng để kiểm thử các API endpoint xử lý việc tải lên tệp. Bạn có thể sử dụng phương thức .attach() để đính kèm tệp vào request.

5. Sử dụng các Thư viện Xác nhận (Chai)

Mặc dù thư viện xác nhận tích hợp sẵn của Jest là đủ cho nhiều trường hợp, bạn cũng có thể sử dụng các thư viện xác nhận mạnh mẽ hơn như Chai với Supertest. Chai cung cấp một cú pháp xác nhận biểu cảm và linh hoạt hơn. Để sử dụng Chai, bạn sẽ cần cài đặt nó:

npm install --save-dev chai

Sau đó, bạn có thể import Chai vào tệp kiểm thử của mình và sử dụng các xác nhận của nó:

const request = require('supertest');
const app = require('./app');
const chai = require('chai');
const expect = chai.expect;

describe('GET /hello', () => {
  it('phản hồi với mã 200 OK và trả về "Hello, World!"', async () => {
    const response = await request(app).get('/hello');
    expect(response.statusCode).to.equal(200);
    expect(response.text).to.equal('Hello, World!');
  });
});

Lưu ý: Bạn có thể cần cấu hình Jest để hoạt động chính xác với Chai. Điều này thường bao gồm việc thêm một tệp thiết lập để import Chai và cấu hình nó để hoạt động với expect toàn cục của Jest.

6. Tái sử dụng Agent

Đối với các bài kiểm thử yêu cầu thiết lập một môi trường cụ thể (ví dụ: xác thực), việc tái sử dụng một agent của Supertest thường có lợi. Điều này tránh được mã thiết lập dư thừa trong mỗi trường hợp kiểm thử.

describe('Authenticated API Tests', () => {
  let agent;

  beforeAll(() => {
    agent = request.agent(app); // Tạo một agent bền bỉ
    // Mô phỏng việc xác thực
    return agent
      .post('/login')
      .send({ username: 'testuser', password: 'password123' });
  });

  it('có thể truy cập một tài nguyên được bảo vệ', async () => {
    const response = await agent.get('/protected').expect(200);
    expect(response.text).toBe('Protected Resource');
  });

  it('có thể thực hiện các hành động khác yêu cầu xác thực', async () => {
    // Thực hiện các hành động đã xác thực khác ở đây
  });
});

Trong ví dụ này, chúng tôi tạo một agent Supertest trong hook beforeAll và xác thực agent đó. Các bài kiểm thử tiếp theo trong khối describe sau đó có thể tái sử dụng agent đã được xác thực này mà không cần phải xác thực lại cho mỗi bài kiểm thử.

Các Phương pháp Tốt nhất cho Kiểm thử Tích hợp API với Supertest

Để đảm bảo kiểm thử tích hợp API hiệu quả, hãy xem xét các phương pháp tốt nhất sau:

Những Sai lầm Phổ biến cần Tránh

Kết luận

Kiểm thử tích hợp API là một phần thiết yếu của quy trình phát triển phần mềm. Bằng cách sử dụng Supertest, bạn có thể dễ dàng viết các bài kiểm thử tích hợp API toàn diện và đáng tin cậy giúp đảm bảo chất lượng và sự ổn định của ứng dụng của bạn. Hãy nhớ tập trung vào việc kiểm thử các luồng công việc end-to-end, sử dụng dữ liệu thực tế, cô lập các bài kiểm thử của bạn và tự động hóa quy trình kiểm thử của bạn. Bằng cách tuân theo các phương pháp tốt nhất này, bạn có thể giảm đáng kể nguy cơ xảy ra các vấn đề tích hợp và cung cấp một sản phẩm mạnh mẽ và đáng tin cậy hơn.

Khi các API tiếp tục thúc đẩy các ứng dụng hiện đại và kiến trúc microservices, tầm quan trọng của việc kiểm thử API mạnh mẽ, và đặc biệt là kiểm thử tích hợp, sẽ chỉ ngày càng tăng. Supertest cung cấp một bộ công cụ mạnh mẽ và dễ tiếp cận cho các nhà phát triển trên toàn thế giới để đảm bảo độ tin cậy và chất lượng của các tương tác API của họ.

Kiểm thử tích hợp: Làm chủ kiểm thử API với Supertest | MLOG