Viết unit test trong NodeJs với Jest

Trong bài viết này, mình sẽ đề cập và hướng dẫn cho các bạn viết Unit Test. Nhưng trước khi đi vào hướng dẫn, mình sẽ tìm hiểu qua về 3 loại test khác nhau mà bạn nên triển khai cho một ứng dụng NodeJS.

Một số loại test phổ biến trong phát triển phần mềm

Unit Testing

Unit Test là một loại kiểm thử phần mềm trong đó các đơn vị hoặc thành phần riêng lẻ của một phần mềm được kiểm tra. Các đơn vị đó có thể là một function, method, module hoặc các object,... Unit Test thường được thực hiện bởi các nhà phát triển với mục đích là nhằm xác minh các đơn vị của mã hoạt động như mong đợi.

Integration Testing

Integration Test là một cấp độ kiểm thử phần mềm trong đó các đơn vị riêng lẻ được kết hợp và kiểm tra để xác minh xem chúng có hoạt động như mong đợi khi được tích hợp hay không. Mục đích chính ở đây là kiểm tra giữa các mô-đun khác nhau. Ví dụ một hàm gọi đến một hàm khác có nghĩa là kết quả kiểm tra cũng phụ thuộc vào hàm được gọi trong hàm cha.

End-2-End Testing

End To End Testing là một phương pháp kiểm thử phần mềm với mục đích là xác nhận toàn bộ phần mềm từ đầu đến cuối cùng với sự tích hợp của nó với các giao diện người dùng. Mục đích của kiểm thử end-to-end là kiểm tra toàn bộ phần mềm về sự phụ thuộc, tính toàn vẹn của dữ liệu và giao tiếp với các hệ thống, giao diện và cơ sở dữ liệu khác để thực hiện sản xuất hoàn chỉnh như kịch bản.

Tại sao nên viết test?

  • Đảm bảo rằng code của bạn hoạt động như mong đợi.
  • Việc viết test sẽ giúp bạn hiểu sâu hơn về nghiệp vụ của chức năng bạn đang làm.
  • Nâng cao chất lượng code.
  • Giúp bạn phát hiện ra các lỗi sớm.

Hướng dẫn viết unit test

Trong phần dưới đây, mình sẽ hướng dẫn các bạn xây dựng demo cơ bản với Unit Testing cho dự án NodeJS của mình. Mình sẽ sử dụng Jest để phục vụ cho việc viết unit tets. Bạn có thể tham khảo về các khái niệm cũng như các sử dụng Jest trong Link này. Trước khi vào demo bạn cần có sẵn một dự án NodeJS để phục vụ cho việc viết test. Nếu chưa có bạn có thể clone example tại đây , mình kiến trúc cũng như cách tổ chức code của nó khá là xịn xò. Bắt đầu viết test nhé.

Install package jest:

$ npm install jest --save-dev

hoặc

$ yarn add jest --dev

Trong file package.json mình sẽ thêm một câu lệnh để chạy test với jest

{
  ...
  "scripts": {
    "start": "nodemon --exec babel-node src/index.js",
    "test": "jest"
  },
  ...
}

Ngoài ra, nếu bạn muốn chạy unit test với tệp cấu hình của mình bạn có thể bổ sung đường dẫn của file config vào trong câu lệnh. Ví dụ:

{
  ...
  "scripts": {
    "start": "nodemon --exec babel-node src/index.js",
    "test": "jest --config ./jest.config.json"
  },
  ...
}

Tiếp đến chúng ta sẽ tạo thêm một file jest.config.json để define những cấu hình mà jest sẽ sử dụng trong quá trình thực thi unit test.

touch jest.config.json

Trong cấu hình unit test tạm thời mình sẽ define cơ bản như thế này:

{
  "testRegex": "((\\.|/*.)(test))\\.js?$"
}

Trong các module cần viết unit test, chúng ta sẽ tạo 1 file tests/index.test.js để viết unit test. Sau khi đã tạo file xong thì bắt đầu viết unit test nhé. Mình sẽ viết demo unit test cơ bản dưới đây cho chức năng order hàng hoá với Order service. Bạn có thể tham khảo qua nhé.

describe('Order Service', () => {
  describe('Order Service -> Add new order', () => {
    it('When price under 1000, expect order to be approval', () => {
      const newOrder = new OrderService().add({name: "Iphone 12", phone: "+84123456", price: 900});
      expect(newOrder.status).to.equal('approval');
    });
    it('When price higher 1000, expect order not to be approval', () => {
      const newOrder = new OrderService().add({name: "Iphone 12", phone: "+84123456", price: 1200});
      expect(newOrder.status).to.equal('reject');
    });
    it('when incomplete order is provided with no phone number, expect an error', () => {
      const newOrder = new OrderService().add({name: "Iphone 12", price: 1200});
      expect(newOrder.status).to.equal('error');
    });
  });
});

Sau đó hãy chạy unit test với câu lệnh: npm run test để xem kết quả của các unit test đã chạy nhé. Dưới đây là kết quả sau khi mình run unit test:

Ngoài ra, nếu bạn muốn mỗi lần code unit test thay đổi thì jest sẽ tự động thực thi việc chạy unit test lại thì bạn có thể thêm dòng lệnh sau

{
  ...
  "scripts": {
    "start": "nodemon --exec babel-node src/index.js",
    "test": "jest --config ./jest.config.json",
    "test:watch": "npm run test -- --watch"
  },
  ...
}

Tổng kết

Trong bài viết trên, mình đã hướng dẫn các bạn cài đặt và triển khai các unit test cơ bản cho một dự án NodeJS. Xoanh quanh việt unit test sẽ có rất nhiều vấn đề khác nhau mà chúng ta cần thảo luận. Mình sẽ để link tham khảo các về đề cũng như cách viết unit test sao cho đúng trong Link này. Hy vọng nó hữu ích cho bạn.


All Rights Reserved