🔬 Unit Test là gì?
Thử từng mảnh code nhỏ nhất, tách riêng ra.
1
Hiểu nó là gì
Unit Test kiểm tra một hàm hoặc một lớp đơn lẻ, không đụng tới database hay mạng, nên chạy rất nhanh.
Nói theo đời thường:
Như thử riêng từng linh kiện trước khi lắp: bóng đèn sáng chưa, công tắc bật được chưa, rồi mới ráp cả mạch.
Như thử riêng từng linh kiện trước khi lắp: bóng đèn sáng chưa, công tắc bật được chưa, rồi mới ráp cả mạch.
⚠ Chỗ ẩn dụ này hỏng
Thử riêng bóng đèn thì bóng nào cũng như bóng nào. Nhưng một hàm hiếm khi đứng một mình — nó gọi hàm khác, đọc giờ hệ thống, lấy dữ liệu từ đâu đó.
Để test được “riêng”, bạn phải cắt hết các dây nối đó bằng mock. Và cắt càng nhiều thì cái bạn đang test càng xa với cái chạy thật. Đó là đánh đổi cố hữu của unit test, không phải lỗi ai làm sai.
2
Code trông thế nào
// Hàm cần test function tinhTien(gia, soLuong) { return gia * soLuong } // Unit test test('nhân giá với số lượng', () => { expect(tinhTien(100, 3)).toBe(300) })
Không mở trình duyệt, không gọi mạng. Chạy xong trong vài mili giây.
3
Khi nào bạn dùng nó
✓ Dùng khi
- Hàm có logic tính toán, nhiều nhánh if
- Muốn phản hồi trong 1 giây thay vì 1 phút
- Cần cố định một quy tắc nghiệp vụ để sau không ai vô tình đổi
✗ Đừng dùng khi
- Hàm chỉ gọi thẳng sang hàm khác, không có logic gì
- Thứ cần kiểm tra là các mảnh ghép với nhau
Chưa cần biết: độ phủ nhánh, kiểm thử theo tính chất, mutation testing.
Để dành tới Mốc 3 — Tự sửa được khi nó hỏng: Test đỏ trên CI mà xanh ở máy bạn, và bạn biết bắt đầu tìm từ đâu.
Dấu hiệu bạn đã cần học nó: Khi coverage báo 90% mà production vẫn lỗi đều đều.
4
Đi đâu tiếp
- MockCông cụ cắt dây nối để hàm đứng một mình được.
- Integration TestTầng trên: thử các mảnh ghép lại với nhau.
- Test CoverageĐo xem unit test đã chạm tới bao nhiêu phần code.
🧪 Thử 2 phút, không cần cài gì
F12 → Console, tự làm một unit test thô sơ:const f = (a,b) => a * b
console.assert(f(100,3) === 300, 'sai')⚖ Hay bị nhầm với thuật ngữ khác
- Unit Test, Integration Test và E2E Test khác nhau thế nào?Integration Test · E2E Test