CYBERSOFT
Đăng nhập

PACT: Provider verification — phát lại hợp đồng trên provider thật

Chuyên nâng caoContract/PACTAPINâng cao
🗓 1 tháng trước19 phút đọc·👁 479 lượt xem👤 419 người đọc

Cơ chế phát lại, cài Verifier, provider states, requestFilter, versioning & tương thích ngược, message pact và đưa verification vào CI.

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.

Oracle của bài này: provider PHẢI thoả mãn mọi interaction mà một consumer thật đã cam kết. Không phải 'API trả 200', mà là 'cấu trúc và ràng buộc đúng như hợp đồng'.

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.

Provider verification · プロバイダ検証の流れ Pact file(interactions) Verifierreplay each request Real providerrunning instance provider stateseed data before replay actual response == expected ? PASS : FAIL
Luồng phát lại: Verifier gửi request từ pact, gieo state, so phản hồi.

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.

javascript
// 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();
});
💡 Luôn để verifyProvider() trả về Promise và return nó trong test — nếu quên return, test runner có thể báo xanh trước khi verification thực sự chạy xong.
🔒

Nội dung bị khoá

Bạn đang xem bản xem trước. Đăng nhập để mở khoá toàn bộ bài viết và tất cả tài liệu Tester/QA.

Đã xem 24% nội dung
  • Đọc trọn vẹn mọi bài viết
  • Lưu bài & ghi chú cá nhân
  • Theo dõi tiến độ đã đọc
  • Luyện phỏng vấn, ISTQB, Mock
Đăng nhập để đọc tiếp

Chưa có mã? Lấy mã qua Fanpage / Zalo CyberSoft.

0

💬 Bình luận (0)

Bạn có thể đọc mọi bình luận. Đăng nhập để bình luận

Chưa có bình luận nào. Hãy là người đầu tiên!