📊 Test Coverage là gì?
Bao nhiêu phần code đã được test chạm tới.
1
Hiểu nó là gì
Test Coverage đo tỉ lệ dòng hoặc nhánh code được test chạy qua. Con số cao không có nghĩa test tốt, vì chạy qua khác với kiểm tra kỹ.
Nói theo đời thường:
Như quét nhà: đi hết mọi phòng chưa chắc đã sạch, nhưng còn phòng chưa bước vào thì chắc chắn chưa quét.
Như quét nhà: đi hết mọi phòng chưa chắc đã sạch, nhưng còn phòng chưa bước vào thì chắc chắn chưa quét.
⚠ Chỗ ẩn dụ này hỏng
Quét nhà: đi hết phòng chưa chắc đã sạch. Với coverage thì tệ hơn — chỉ tiêu coverage cao còn khiến người ta viết test dối.
Ép chỉ tiêu 80% thì đội sẽ viết test gọi hàm mà không kiểm tra gì cả, chỉ để dòng code được “chạy qua”. Coverage là chỉ báo, không phải mục tiêu. Nó chỉ nói chắc chắn một điều: phần chưa được chạm tới thì chắc chắn chưa được test.
2
Code trông thế nào
# Đo coverage npx jest --coverage File | % Stmts | % Branch | ------------|---------|----------| tinhTien.js | 100 | 50 | ← chạy hết dòng, mới nửa nhánh if
Cột Branch đáng tin hơn cột Stmts nhiều — nó đếm các nhánh if đã đi qua.
3
Khi nào bạn dùng nó
✓ Dùng khi
- Tìm vùng code chưa ai test
- Theo dõi xu hướng qua thời gian (đang tăng hay giảm)
✗ Đừng dùng khi
- Đặt thành KPI ép đội đạt cho bằng được
- Coi 100% coverage là code không còn bug
Chưa cần biết: mutation testing, coverage theo vùng thay đổi, cổng chặn trong CI.
Để 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 90% mà lỗi production vẫn đều đặn — lúc đó cần mutation testing để biết test có thực sự bắt lỗi không.
4
Đi đâu tiếp
- Unit TestLoại test đóng góp nhiều nhất vào coverage.
- Test ReportCoverage thường nằm chung trong báo cáo.
- AssertionTest không có assertion vẫn tính coverage — đó là lỗ hổng lớn nhất.
🧪 Thử 2 phút, không cần cài gì
Nghĩ về một hàm cóif/else. Viết một ca test đi vào nhánh if. Coverage dòng có thể đã 100%, nhưng nhánh else chưa ai bước vào bao giờ. Đó là khoảng cách giữa hai con số.