Contract testing là gì, khác gì Integration testing
🎯 Mục tiêu học: hiểu vì sao khảo sát ngành xếp contract testing vào nhóm ít được dùng nhất (17%) dù được đánh giá là khoảng trống quan trọng — và khi nào nó thực sự cần thiết.
🔗 Liên hệ với Chương 2: Chương 6 là phần mở rộng có hệ thống của Nhóm 7 — Response contract trong khung Mục 2.1. Ở Chương 2, kiểm tra contract chỉ là 1 case đơn lẻ trong checklist (vd "response đúng cấu trúc không"); Chương 6 biến việc đó thành 1 quy trình tự động hoá lặp lại được cho toàn bộ API, thay vì kiểm tra thủ công từng lần.
Contract testing là gì
Contract testing kiểm tra "hợp đồng" — cấu trúc request/response đã thống nhất — giữa bên tiêu thụ API (consumer) và bên cung cấp API (provider), mà không cần chạy cả 2 hệ thống cùng lúc. Đây chính là điểm khác biệt cốt lõi so với Integration testing (Chương 3), vốn luôn cần cả 2 phía chạy thật để test.
💡 Hiểu "hợp đồng" bằng ví dụ cụ thể
Hãy hình dung đội Frontend và đội Backend cùng ngồi thống nhất trước: khi gọi GET /v1/orders/{orderId}, response sẽ luôn có đúng các field này, đúng kiểu này. Bản thống nhất đó — thường được viết ra thành 1 file schema (OpenAPI/Swagger, hoặc file Pact) — chính là "hợp đồng":
// "Hợp đồng" cho GET /v1/orders/{orderId} — cả 2 đội cùng đồng ý
{
"orderId": "string", // bắt buộc có
"customerId": "string", // bắt buộc có
"status": "PAID | PENDING | CANCELLED", // chỉ 1 trong 3 giá trị này
"total": "number" // bắt buộc là số, không phải chuỗi "350000"
}Từ bản hợp đồng này, mỗi bên tự kiểm tra phần của mình tách rời nhau, không cần chạy cùng lúc:
- Phía Consumer (frontend, hoặc service khác gọi API này): viết test khẳng định "tôi trông đợi response đúng như hợp đồng" — chạy được ngay cả khi Backend chưa code xong, vì không gọi API thật.
- Phía Provider (backend cung cấp API): sau khi code xong, tự gọi API thật của mình 1 lần rồi so response thực tế với đúng hợp đồng đó — nếu sau này backend lỡ đổi
totaltừ số thành chuỗi, hoặc đổi tên field, test sẽ báo đỏ ngay lập tức.
Cả hai không cần đứng chờ nhau chạy chung một lúc — chỉ cần cùng nhìn vào một bản hợp đồng làm "trọng tài". Đây là lý do contract test chạy nhanh như unit test (Tầng 1 — Chương 7), trong khi Integration testing (Chương 3) bắt buộc phải khởi động cả 2 hệ thống thật rồi mới gọi thử được.
So sánh Contract testing vs. Integration testing
| Tiêu chí | Contract testing | Integration testing |
|---|---|---|
| Cần chạy cả 2 hệ thống? | Không — chỉ cần bản mô tả hợp đồng (schema/spec) | Có — cả consumer và provider phải chạy thật |
| Tốc độ chạy | Nhanh, có thể chạy như unit test (Tầng 1 — Chương 7) | Chậm hơn, cần môi trường đầy đủ (Tầng 2 — Chương 7) |
| Phát hiện lỗi gì | Sai cấu trúc dữ liệu, thiếu field, sai kiểu — lỗi 'hợp đồng' | Lỗi hành vi thực tế: timeout, rollback, dữ liệu tham chiếu sai (Chương 3) |
| Phát hiện sớm tới đâu | Ngay khi provider đổi API, trước khi merge/deploy | Chỉ phát hiện khi cả 2 hệ thống thực sự chạy cùng nhau |
📌 Ghi nhớ
Contract testing không thay thế Integration testing — 2 loại bổ sung cho nhau: contract testing bắt lỗi "sai cấu trúc" sớm và rẻ, integration testing bắt lỗi "sai hành vi" toàn diện hơn nhưng tốn kém hơn.
📖 Thuật ngữ Anh–Việt (mục này)
Đề thi dùng thuật ngữ tiếng Anh — nhớ đúng cụm bên trái. Bấm 🔊 để nghe từng từ, hoặc "Đọc tất cả" để nghe lần lượt Anh → (vài giây) → Việt.
| Thuật ngữ (EN) | Nghĩa & ghi nhớ nhanh |
|---|---|
| Contract | Hợp đồng — cấu trúc request/response đã thống nhất giữa 2 hệ thống |
| Consumer | Bên tiêu thụ API — hệ thống gọi API của bên khác |
| Provider | Bên cung cấp API — hệ thống cung cấp API cho bên khác gọi |
📎 Nội dung do maiqai.com biên soạn dựa trên thực hành phổ biến về contract testing, không sao chép nguyên văn từ nguồn nào.