1. Sau hợp đồng: trách nhiệm chuyển sang provider
Ở bài trước, consumer đã sinh ra một pact file mô tả chính xác những gì nó kỳ vọng ở provider. Nhưng một hợp đồng chỉ có giá trị khi bên còn lại thực sự tôn trọng nó. Provider verification là bước phát lại (replay) từng interaction trong pact vào một instance provider đang chạy thật, rồi so sánh phản hồi thực tế với phản hồi kỳ vọng. Đây là nơi contract testing chứng minh giá trị: nếu provider vô tình đổi tên trường, đổi kiểu dữ liệu hay bỏ một endpoint, verification sẽ đỏ ngay trong CI của provider — trước khi thay đổi kịp chạm tới production.
Điểm mấu chốt cần nhớ: verification không chạy trên môi trường thật với dữ liệu thật của khách hàng, mà chạy trên một provider được dựng riêng cho kiểm thử, với dữ liệu được gieo có kiểm soát. Provider không cần biết consumer là ai hay UI trông thế nào; nó chỉ cần chứng minh rằng với mỗi yêu cầu trong hợp đồng, nó trả về đúng cấu trúc đã cam kết. Nhờ tách bạch này, một provider phục vụ 40 consumer vẫn chỉ cần một bộ verification duy nhất đọc tất cả pact liên quan.
2. Cơ chế phát lại hoạt động thế nào
Verifier đọc pact file, lấy ra danh sách interaction, và với mỗi interaction nó dựng lại đúng HTTP request (method, path, query, header, body) rồi gửi tới provider đang chạy. Phản hồi thực tế được so khớp với phần response kỳ vọng, nhưng không so khớp cứng từng byte: các matcher mà consumer đã dùng (như like, eachLike, regex) được diễn giải để so theo kiểu và ràng buộc, không so theo giá trị cụ thể. Nhờ vậy provider được tự do trả về '123' hay '999' miễn là vẫn là chuỗi số đúng định dạng.
Một chi tiết quan trọng: mỗi interaction thường đi kèm một 'provider state' — một chuỗi mô tả tiền đề dữ liệu, ví dụ 'tài khoản 123 tồn tại và có số dư 500'. Trước khi phát lại request, Verifier gọi một hook để đưa provider về đúng trạng thái đó. Nếu thiếu bước gieo trạng thái này, request sẽ chạy trên dữ liệu ngẫu nhiên và verification sẽ đỏ vì lý do sai — không phải vì hợp đồng bị phá, mà vì dữ liệu không khớp bối cảnh.
3. Cài đặt Verifier với pact-js
Ở hệ sinh thái JavaScript/TypeScript, thư viện @pact-foundation/pact cung cấp lớp Verifier. Ý tưởng là: khởi động provider thật (hoặc một bản dựng test của nó) trên một cổng cục bộ, rồi trỏ Verifier vào cổng đó cùng với nguồn pact. Verifier sẽ tự làm phần còn lại. Đoạn code dưới đây là khung tối thiểu cho một provider Node/Express, thường được đặt trong bộ test của chính provider và chạy như một bài test bình thường.
// provider.pact.test.js
import { Verifier } from "@pact-foundation/pact";
import { app } from "../src/app.js";
let server;
beforeAll(() => { server = app.listen(8080); });
afterAll(() => server.close());
test("Provider honours the wallet consumer contract", () => {
return new Verifier({
provider: "wallet-api",
providerBaseUrl: "http://localhost:8080",
// đọc pact từ file cục bộ (bài sau sẽ đổi sang Broker)
pactUrls: ["./pacts/wallet-web-wallet-api.json"],
providerVersion: process.env.GIT_SHA || "dev",
}).verifyProvider();
});
💬 Bình luận (0)
Chưa có bình luận nào. Hãy là người đầu tiên!