Giới Thiệu
Chào mừng bạn trở lại với phần thứ hai của chuỗi bài viết về unit test với Jest! Trong phần này, chúng ta sẽ khám phá cách cài đặt và viết unit test một cách chi tiết nhất. Bên cạnh đó, mình cũng sẽ giải thích một số thuật ngữ thường gặp trong unit test, giúp bạn hiểu rõ hơn về cách giao tiếp trong cộng đồng lập trình viên.
Từ Ngữ Cơ Bản
Trong thế giới lập trình, chúng ta thường gặp phải những thuật ngữ như formal và informal. Để làm rõ hơn, hãy xem xét thuật ngữ Test Double và Mock. Trong ngữ cảnh unit test, từ Mock thường được sử dụng như một cách nói informal, trong khi Test Double là cách gọi formal hơn. Việc hình thành nhiều thuật ngữ như vậy giúp chúng ta giao tiếp dễ dàng hơn trong hoàn cảnh cụ thể.
Thông Tin Gói Phần Mềm
Trước khi bắt đầu, hãy xem qua danh sách các gói phần mềm chúng ta sẽ sử dụng:
- "body-parser": "^1.20.2",
- "express": "^4.19.2",
- "mysql2": "^3.9.5",
- "sequelize": "^6.37.3",
- "jest": "^29.7.0".
Bạn có thể tải source code của bài viết này tại đây.
Cài Đặt Môi Trường
Trước tiên, hãy tạo một thư mục để bắt đầu với unit test. Bạn có thể sử dụng bất kỳ thư mục nào trên máy của mình. Ví dụ, bạn có thể vào thư mục Documents
và thực hiện các lệnh sau:
$ mkdir testing_with_jest
$ cd testing_with_jest
$ npm init -y
$ npm i jest@29.7.0 --save-dev
$ npm i body-parser@1.20.2 express@4.19.2 mysql2@3.9.5 sequelize@6.37.3
$ npm init jest@29.7.0
Sau khi nhập xong lệnh npm init jest@29.7.0
, bạn hãy chọn các tùy chọn mà mình mong muốn, và thêm cấu hình vào phần scripts
trong file package.json
của bạn.
Viết Unit Test Đầu Tiên
Để tạo một file test cho Jest, bạn cần đặt tên theo quy tắc sau: <tên_file>.spec.js hoặc <tên_file>.test.js. Chúng ta sẽ viết test cho hàm isEven.js
như sau:
javascript
// src/isEven.js
const isEven = (number) => {
return number % 2 === 0;
};
module.exports = isEven;
Hàm isEven
nhận một tham số là number
, và sẽ trả về true
nếu là số chẵn và false
nếu là số lẻ. Vậy chúng ta có hai trường hợp cần kiểm thử:
- Khi đối số là số chẵn, hàm sẽ trả về
true
. - Khi đối số là số lẻ, hàm sẽ trả về
false
.
Để viết các test case trong Jest, chúng ta sử dụng hàm test() với hai tham số: tên của test case và một hàm thực hiện các assertions:
javascript
// isEven.spec.js
const isEven = require('./isEven.js');
test("isEven trả về true với số chẵn", () => {
expect(isEven(2)).toBe(true);
});
test("isEven trả về false với số lẻ", () => {
expect(isEven(3)).toBe(false);
});
Chạy lệnh sau trong terminal để thực hiện các test:
$ npm run test
Hãy tiếp tục và kiểm tra xem unit test của bạn đã chạy thành công chưa!
Thực Hành Sử Dụng Fixtures
Bạn có thể sử dụng test.each()
để đơn giản hóa quy trình viết test khi xử lý nhiều giá trị cố định. Ví dụ:
javascript
const integerEvenNumbers = [2, 100, 6, 20];
const integerOddNumbers = [1, 3, 101, 2001, 23];
test.each(integerEvenNumbers)(
"isEven trả về true với số chẵn %i",
(evenNumber) => expect(isEven(evenNumber)).toBe(true)
);
test.each(integerOddNumbers)(
"isEven trả về false với số lẻ %i",
(oddNumber) => expect(isEven(oddNumber)).toBe(false)
);
Nhóm Các Test Case Thành Test Suite
Khi cần tổ chức các test case có liên quan, bạn có thể dùng describe()
để nhóm chúng lại. Ví dụ:
javascript
describe("isEven", () => {
const evenNumbers = [2, 100, 6, 20];
const oddNumbers = [1, 3, 101, 2001, 23];
it.each(evenNumbers)("isEven trả về true với số chẵn %i", (evenNumber) => {
expect(isEven(evenNumber)).toBe(true);
});
it.each(oddNumbers)("isEven trả về false với số lẻ %i", (oddNumber) => {
expect(isEven(oddNumber)).toBe(false);
});
});
Kiểm Tra Độ Phủ (Coverage)
Để lấy báo cáo độ phủ của các unit test, bạn có thể dùng flag --coverage
:
$ npm run test --coverage
Lưu ý rằng việc đạt độ phủ 100% không đảm bảo bạn đã kiểm tra đầy đủ mọi trường hợp, nhưng nó cho thấy mọi dòng mã đã được chạy qua test.
Kết Luận
Trong bài viết này, chúng ta đã cùng nhau tìm hiểu cách viết một unit test đơn giản, cách tổ chức các test case và cách kiểm tra độ phủ của test. Công cụ Jest giúp chúng ta dễ dàng hơn trong việc kiểm thử phần mềm, từ đó đảm bảo chất lượng mã nguồn tốt hơn. Ở các phần tiếp theo, hãy cùng mình khám phá sâu hơn cách viết test trong các dự án thực tế!
Tài Liệu Tham Khảo
- Martin Fowler on Mocks
- Clean Code Blog
- Jest API Documentation
source: viblo