Contract test kiểm tra rằng hợp đồng giữa một consumer và một provider vẫn được tôn trọng, mà không cần chạy cả hai cùng lúc.
Consumer-driven nghĩa là hợp đồng do bên gọi viết ra: consumer khai báo "tôi gửi request thế này và cần response có các trường này". Tập hợp mong đợi của tất cả consumer trở thành ràng buộc mà provider phải thoả.
Cách chạy (kiểu Pact):
1. Test của consumer chạy với một mock provider, sinh ra file contract (pact).
2. Contract được đẩy lên broker.
3. CI của provider replay contract đó vào provider thật. Provider đổi gì làm vỡ mong đợi của consumer thì build của provider đỏ ngay, trước khi lên production.
Vì sao không dùng integration test toàn hệ thống:
- Muốn test một service phải dựng đủ N service phụ thuộc và dữ liệu của chúng — chậm và tốn.
- Test loại này flaky: một service phụ trợ lỗi vặt làm đỏ build không liên quan, lâu ngày team bỏ qua kết quả test.
- Khó xác định thủ phạm khi đỏ, và không scale khi số service tăng.
- Ràng buộc lịch: phải chờ tất cả service ở phiên bản tương thích mới test được — mất tính deploy độc lập.
Contract test cho tín hiệu tương đương ở phần quan trọng nhất (giao diện giữa các service) với chi phí bằng unit test. Vẫn giữ một ít end-to-end test cho các luồng doanh thu chính, nhưng đó là lưới an toàn cuối, không phải tầng test chính.
Giới hạn cần nói rõ: contract test kiểm tra hình dạng và ngữ nghĩa cơ bản của giao tiếp, không kiểm tra logic nghiệp vụ bên trong provider — phần đó vẫn thuộc unit/service test.