- Unit test: kiểm tra một đơn vị nhỏ (hàm, class) trong cô lập, mock/stub dependency. Chạy trong mili-giây, fail chỉ đúng chỗ hỏng → dễ tìm nguyên nhân, viết nhiều nhất.
- Integration test: kiểm tra nhiều thành phần ghép với nhau — code với DB thật, gọi API service khác, đọc/ghi queue. Chậm hơn vì cần hạ tầng (DB test, container).
- E2E test: chạy cả hệ thống theo góc nhìn người dùng (qua UI hoặc API), toàn bộ stack thật. Đắt nhất, chậm nhất, dễ flaky (fail chập chờn vì timing/network) → chỉ giữ vài luồng quan trọng.
Phân bổ: nhiều unit → ít integration → rất ít e2e (nguyên tắc "kim tự tháp" test). Lý do: test nhanh/rẻ chạy thường xuyên bắt lỗi sớm; e2e chậm và mơ hồ nên chỉ phủ luồng cốt lõi. Quy tắc chung: viết test ở tầng thấp nhất có thể bắt được lỗi đó.