Unit test, integration test và end-to-end test trong một backend service là gì?
Đáp án mẫu
Ba loại này khác nhau ở lượng code và hạ tầng thật mà chúng chạy.
Unit test kiểm tra một class hoặc function một cách cô lập. Các collaborator như database hay HTTP client được thay bằng test double, nên test chạy trong mili giây và không cần mạng.
Integration test chạy nhiều phần cùng nhau với hạ tầng thật: repository chạy với PostgreSQL thật, hoặc controller đi qua toàn bộ HTTP stack. Nó bắt được lỗi wiring, SQL và serialization mà unit test không thấy.
End-to-end test điều khiển cả hệ thống đã deploy như một client thật, ví dụ gọi public API rồi kiểm tra kết quả qua nhiều service. Nó cho độ tin cậy cao nhất nhưng chậm và dễ flaky nhất.
Hình dạng thường gặp là nhiều unit test, vừa phải integration test và ít end-to-end test, vì chi phí và độ flaky tăng dần khi đi lên.
Hãy chọn tầng rẻ nhất mà vẫn bắt được loại bug bạn lo ngại.
Ý chính
- Unit test cô lập một unit bằng test double
- Integration test dùng hạ tầng thật như database
- End-to-end test chạy toàn bộ hệ thống đã deploy
- Chi phí và độ flaky tăng theo từng tầng
Câu hỏi nối tiếp thường gặp
- Test controller với service được mock là unit hay integration test?
Lỗi thường gặp
- Gọi mọi test dùng framework là integration test
- Test mọi quy tắc nghiệp vụ qua tầng end-to-end