Pact เป็นเครื่องมือสำหรับการทดสอบสัญญาแบบ consumer-driven: ฝั่งผู้บริโภค (consumer) เขียน unit test เพื่อสร้างสัญญา ฝั่งผู้ให้บริการ (provider) เล่นซ้ำสัญญานั้นกับโค้ดจริง, Pact Broker เก็บผลการตรวจสอบ และ can-i-deploy บอก pipeline ว่าเวอร์ชันนั้นปลอดภัยต่อการ deploy หรือไม่ วิธีนี้ช่วยตรวจจับปัญหาการรวมระบบที่ unit test แบบแยกส่วนตรวจไม่พบ แต่แลกมาด้วย DSL สำหรับแต่ละภาษา, provider states ที่ต้องดูแล, broker ที่ต้องจัดการ และการแก้ปัญหา verification ที่รันซ้ำในเครื่องได้ยาก
สำหรับทีมที่ปัญหาหลักคือ schema drift ระหว่าง producer และ consumer, Apidog เป็นทางเลือกที่ใช้แนวทาง spec-first: ใช้ OpenAPI spec หนึ่งชุดเป็นแหล่งข้อมูลจริง, ตรวจสอบ response เทียบกับ schema ทุกครั้งที่รันทดสอบ, สร้าง mock จาก spec และรันใน CI ผ่าน Apidog CLI
อย่างไรก็ตาม Apidog ไม่ได้จำลอง workflow แบบ consumer-driven ของ Pact Broker: ไม่มีไฟล์ pact, ไม่มี verification matrix และไม่มี can-i-deploy หากองค์กรของคุณต้องควบคุมการ deploy ของหลายบริการที่ออกเวอร์ชันแยกกัน Pact ยังเหมาะกว่า
สิ่งที่ Pact ทำได้ดี
Pact เป็นเครื่องมือแบบ code-first สำหรับการทดสอบ HTTP และ message integration โดยมี flow หลักดังนี้
- Consumer รัน test กับ Pact mock provider
- Test บันทึกคู่ request/response เป็นไฟล์ pact
- Provider เล่นซ้ำ interaction เหล่านั้นกับ implementation จริง
- Provider states เตรียมข้อมูลสำหรับแต่ละ interaction
- Broker เก็บผล verification และใช้ตรวจสอบก่อน deploy
ตัวอย่างคำถามที่ Pact Broker ตอบได้คือ:
can-i-deploy \
--pacticipant billing-service \
--version 2.4.0 \
--to-environment production
ตามเอกสาร Pact Broker, exit code 0 หมายถึง deploy ได้ และ 1 หมายถึงไม่ควร deploy
Pact มี implementation อย่างเป็นทางการสำหรับหลายภาษา เช่น JVM, JavaScript, Go, .NET, Python, Ruby, Rust, PHP และ Swift หากไม่ต้องการโฮสต์ broker เอง สามารถใช้ PactFlow ซึ่งเป็น managed broker ได้
ต้นทุนที่เพิ่มขึ้นเมื่อใช้ Pact
ทุกทีม consumer ต้องเขียน DSL
Pact สร้างสัญญาจาก test code ดังนั้น consumer ทุกทีมต้องเรียนรู้ DSL ของ Pact ตามภาษาที่ใช้
ผลที่ตามมาคือ:
- ทีม JavaScript, Go และ .NET ต้องใช้ DSL คนละชุด
- matching rules ต้องถูกเขียนและดูแลใน test
- mock configuration กระจายอยู่ในหลาย repository
- การเปลี่ยน schema อาจต้องแก้ test หลายทีม
Provider states กลายเป็น test suite ที่ซ่อนอยู่
แต่ละ interaction อาจต้องมีสถานะเฉพาะ เช่น:
ผู้ใช้
42มีใบแจ้งหนี้ที่ยังไม่ได้ชำระ
Provider ต้องเขียน handler เพื่อสร้างข้อมูลนี้ก่อน verification เมื่อ consumer เพิ่มขึ้น provider ก็ต้องดูแล state handler มากขึ้น แม้รูปแบบข้อมูลบางส่วนจะถูกกำหนดโดย consumer
Broker คือโครงสร้างพื้นฐานอีกชิ้นหนึ่ง
หากโฮสต์เอง คุณต้องดูแล:
- ฐานข้อมูล
- การอัปเกรด
- authentication
- webhooks สำหรับ CI
- convention ของ branch และ environment
- pending pacts และ version tagging
หากใช้บริการภายนอก ก็เป็น vendor เพิ่มอีกหนึ่งราย
Provider verification อาจไม่เสถียร
การ verification รันกับ provider จริง จึงดึง dependency ของ runtime เข้ามาทั้งหมด เช่น:
- database seed
- auth stub
- background job
- integration dependency
- test environment configuration
เมื่อ build ล้มเหลว ทีม provider อาจต้องแก้ test ที่เขียนโดย consumer อีกทีมหนึ่ง และหาก can-i-deploy บล็อก deployment การแก้ปัญหาข้ามทีมอาจกลายเป็นภาระหลักของกระบวนการ
PactFlow มีแนวทาง bi-directional contract testing ที่ลดขั้นตอน replay: provider เผยแพร่ OpenAPI spec และ consumer เผยแพร่สัญญาที่ได้จาก mock จากนั้นระบบเปรียบเทียบ schema แบบ static แนวคิดนี้สอดคล้องกับการใช้ spec เป็นสัญญา ซึ่งอธิบายเพิ่มเติมในบทความ การทดสอบสัญญาแบบ bidirectional
ทางเลือกแบบ spec-first: Apidog
Apidog ใช้ OpenAPI spec เป็นศูนย์กลางสำหรับเอกสาร, mock server, request validation และ automated testing
แนวคิดหลักคือ:
ใช้สัญญาเพียงชุดเดียว
OpenAPI spec คือข้อตกลงร่วมระหว่าง provider และ consumer ไม่ต้องสร้าง pact file แยกตามภาษาตรวจ schema ทุกครั้งที่รัน
Response ที่ไม่ตรงกับ schema เช่น เปลี่ยนชื่อ field, เปลี่ยน type หรือเอา required property ออก สามารถทำให้ test ล้มเหลวได้ทันทีเริ่มพัฒนา consumer จาก mock ได้เร็ว
เมื่อกำหนด endpoint และ schema แล้ว ทีม frontend หรือ downstream สามารถใช้ mock จาก spec ได้ก่อน provider implementation จะเสร็จบังคับใช้ใน CI โดยไม่ต้องมี broker
ใช้apidog runเพื่อรัน scenario tests และ schema validation ใน pipeline ของ provider
ตัวอย่าง pipeline:
name: API contract check
on:
pull_request:
push:
branches: [main]
jobs:
contract-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Apidog CLI
run: npm install -g apidog-cli
- name: Run API scenarios
run: apidog run ./tests/api-scenarios
แนวทางนี้ไม่ได้ให้ deployment matrix แบบ Pact แต่ช่วยป้องกัน provider จากการปล่อย implementation ที่ไม่ตรงกับ spec ตั้งแต่ใน CI ของตัวเอง
อ่านแนวคิดเพิ่มเติมได้ใน การทดสอบสัญญา API
เปรียบเทียบการทำงานทีละส่วน
1. Artifact ของสัญญา
ใน Pact สัญญาคือไฟล์ JSON ที่สร้างจาก interaction ตัวอย่างของ consumer แต่ละราย
ใน Apidog สัญญาคือ OpenAPI spec ที่รวม:
- request และ response schema
- required fields
- enums
- status codes
- error response
- endpoint documentation
ข้อแลกเปลี่ยนคือ Pact ระบุได้ว่า consumer รายใดใช้ field ใด ขณะที่ shared spec ไม่มี usage signal ระดับนั้น แต่ shared spec ทำให้เอกสาร, mock, test และ client ใช้แหล่งข้อมูลเดียวกัน
ดูรายละเอียดเรื่องนี้ได้ใน API contract คืออะไร
2. การตรวจสอบฝั่ง provider
Pact เล่นซ้ำ interaction ของ consumer กับ live provider
แนวทางใน Apidog คือ:
- สร้าง OpenAPI spec สำหรับ API
- สร้าง scenario tests สำหรับ endpoint สำคัญ
- เปิด schema validation
- รัน scenario ด้วย CLI ในทุก provider build
ตัวอย่าง scenario ที่ควรมี:
GET /users/{id}
- ส่งคำขอด้วย id ที่มีอยู่
- ตรวจสอบ status code = 200
- ตรวจสอบ response ตรงกับ User schema
- ตรวจสอบ required properties
Provider ยังคงถูกตรวจเทียบกับสัญญา แต่ไม่ต้องสร้าง provider state handler ตาม interaction ของ consumer
3. การพัฒนาฝั่ง consumer
Pact ให้ consumer แต่ละรายสร้าง mock provider ภายใน test ของตัวเอง
Apidog ให้ mock URL ที่สร้างจาก spec และแชร์ข้ามทีมได้:
Frontend app
|
+--> Apidog Mock Server
|
+--> OpenAPI Spec
ใช้ mock เมื่อ:
- provider ยังพัฒนาไม่เสร็จ
- frontend ต้องเริ่มทำงานก่อน
- ต้องทดสอบ error response ที่ควบคุมได้
- ต้องแยกการพัฒนาจาก environment จริง
หากต้องการข้อมูลเฉพาะ สามารถกำหนด custom expectations เพิ่มเติมได้ ดูการเปรียบเทียบเพิ่มเติมใน contract testing และ mock servers
4. การควบคุม deployment
นี่คือจุดที่ Pact แข็งแกร่งกว่า
Pact มี:
- broker
- verification matrix
- consumer/provider version tracking
can-i-deploy
Apidog ใช้การควบคุมระดับสัญญาแทน:
- provider ที่ละเมิด spec ทำให้ CI ของตัวเองล้มเหลว
- spec change เป็น diff ที่เห็นและ review ได้
- mock และเอกสารอัปเดตจาก spec เดียวกัน
สำหรับบริการไม่กี่ตัวที่ deploy ผ่าน pipeline ที่ประสานกัน การควบคุมระดับสัญญามักเพียงพอ สำหรับองค์กรที่มีหลายสิบทีมและ deploy คนละเวลา matrix ของ Pact ยังคงมีประโยชน์
Pact และ PactFlow เทียบกับ Apidog
| หัวข้อ | Pact + PactFlow | Apidog |
|---|---|---|
| Artifact ของสัญญา | ไฟล์ pact ต่อ consumer | OpenAPI spec หนึ่งชุด |
| ผู้เขียนสัญญา | ทุกทีม consumer, DSL ตามภาษา | แก้ไข spec แบบ visual หรือ code |
| Provider verification | Replay interaction + provider states | Scenario tests + schema validation |
| Consumer mock | Mock provider ใน test | Smart mock จาก spec |
| ตรวจจับ schema drift | ตอน verification | ทุก request และ CI run |
| ควบคุม deployment | Broker matrix + can-i-deploy
|
CI ระดับ service |
| โครงสร้างพื้นฐาน | Broker หรือ PactFlow | Cloud workspace รวมในแพลตฟอร์ม |
| เอกสารและการออกแบบ | ไม่ใช่ขอบเขตหลัก | Interactive docs และ spec editor |
| ค่าใช้จ่าย | Pact เป็น OSS; PactFlow มีแผนตาม tier | ฟรีสูงสุด 4 ผู้ใช้; แผนเสียเงินเริ่มต้นที่ $9/ผู้ใช้/เดือน |
ประเมินต้นทุนก่อนเลือก
Pact เป็นโอเพนซอร์ส แต่ต้นทุนหลักคือเวลาในการประสานงาน:
- เขียนและดูแล DSL tests
- ดูแล provider states
- โฮสต์หรือจัดการ broker
- แก้ verification failures ข้ามทีม
- สอน workflow การจัดการ version และ environment
Apidog ใช้แนวทางรวมเครื่องมือ API client, spec editor, mock, documentation และ testing ไว้ด้วยกัน แผนฟรีครอบคลุมผู้ใช้ 4 คน พร้อม spec editor, mock server, scenario tests, schema validation และ CLI
หากต้องการลดจำนวนเครื่องมือ API ที่ทีมใช้ ให้เริ่มจาก ทางเลือกสำหรับ Postman และดูภาพรวม workflow แบบ spec-first ได้ที่ contract-first development toolstack
วิธีค่อย ๆ ย้ายจาก Pact ไปใช้ OpenAPI-based contract testing
ไม่จำเป็นต้องแปลงไฟล์ pact โดยตรง ให้ยกระดับ OpenAPI spec เป็นสัญญาหลักแทน
ขั้นตอนที่ 1: สร้างหรือรวบรวม OpenAPI spec
หากมี spec อยู่แล้ว ให้นำเข้าใน Apidog
หากยังไม่มี ให้ใช้ไฟล์ pact เป็น checklist เพื่อระบุ:
- endpoint ที่ consumer ใช้จริง
- request parameters
- response fields
- error cases
- status codes
ตัวอย่างโครงสร้าง OpenAPI ขั้นต่ำ:
openapi: 3.0.3
info:
title: Billing API
version: 1.0.0
paths:
/invoices/{id}:
get:
summary: รับข้อมูลใบแจ้งหนี้
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
"200":
description: Invoice
content:
application/json:
schema:
$ref: "#/components/schemas/Invoice"
components:
schemas:
Invoice:
type: object
required:
- id
- status
- total
properties:
id:
type: string
status:
type: string
enum: [pending, paid, overdue]
total:
type: number
ขั้นตอนที่ 2: เปิด schema validation ใน CI
สร้าง test scenarios สำหรับ endpoint ของ provider แล้วรันด้วย Apidog CLI ทุก build
เป้าหมายคือให้ response ที่ไม่ตรง schema หยุด pipeline ก่อน deploy
ขั้นตอนที่ 3: ย้าย consumer ไปใช้ smart mock
แทนที่ Pact mock configuration ของแต่ละ consumer ด้วย hosted mock URL จาก spec
กระบวนการนี้ทำทีละ consumer ได้:
- ย้าย test หรือ environment ของ consumer ไปที่ mock URL
- ยืนยันว่า response ตรงกับ use case
- ลบ DSL และ Pact mock setup เดิม
- ทำซ้ำกับ consumer รายถัดไป
ขั้นตอนที่ 4: Review spec changes เหมือน review code
กำหนดให้การเปลี่ยน OpenAPI spec ผ่าน pull request และ review
ตรวจสอบเป็นพิเศษเมื่อมี:
- การลบ endpoint
- การลบ required field
- การเปลี่ยน type
- การเปลี่ยน enum
- การเปลี่ยน response status
- การเปลี่ยน authentication requirement
ขั้นตอนที่ 5: เลิกใช้ broker เป็นลำดับสุดท้าย
อย่าถอด can-i-deploy ทันทีหากระบบยังมีความเสี่ยงจาก deployment ที่ไม่พร้อมกัน
ให้คง Pact ไว้ใน integration ที่:
- consumer และ provider deploy แยกกัน
- มีหลายเวอร์ชันทำงานพร้อมกัน
- ต้องการคำตอบแบบ machine-verifiable ก่อน deploy
- ผลกระทบจาก breaking change สูง
เมื่อใดที่ Pact ยังเป็นตัวเลือกที่ถูกต้อง
Pact ยังเหมาะเมื่อคุณต้องการตอบคำถามนี้อย่างแม่นยำ:
เวอร์ชันนี้ deploy เข้า production ได้หรือไม่ เมื่อพิจารณาจาก consumer และ provider ทุกเวอร์ชันที่กำลังทำงานอยู่
หากหลายทีม deploy บริการตามตารางของตนเอง, broker matrix และ can-i-deploy ถูกสร้างขึ้นเพื่อแก้ปัญหานี้โดยตรง
Pact ยังมีขอบเขตที่เกี่ยวข้องกับ message-queue contract testing ด้วย
หากต้องการลดขั้นตอน replay แต่ยังอยู่ใน ecosystem เดิมของ PactFlow สามารถพิจารณา bi-directional contract testing ได้ แต่หากปัญหาของคุณคือ schema drift, mock และ CI validation เป็นหลัก การดูแล Pact แบบเต็มรูปแบบอาจเกินความจำเป็น
คำถามที่พบบ่อย
Apidog เป็นเครื่องมือทดสอบสัญญาเหมือน Pact หรือไม่?
ทั้งสองเครื่องมือบังคับใช้สัญญา แต่ใช้โมเดลต่างกัน
- Pact สร้างสัญญาต่อ consumer จาก test code และ replay กับ provider
- Apidog ใช้ OpenAPI spec เป็นสัญญากลาง และตรวจ request/response เทียบกับ schema
Apidog เหมาะกับการตรวจ schema drift โดยไม่ต้องมี broker workflow ดูเพิ่มเติมที่ API contract testing
Apidog รองรับ can-i-deploy หรือ Pact Broker หรือไม่?
ไม่ Apidog ไม่มี verification matrix หรือ cross-service deploy gate
Apidog ควบคุมที่ระดับสัญญา: build ที่ละเมิด spec ควรล้มเหลวใน pipeline ของ service นั้นเอง
หากต้องการ matrix-level deployment control ควรเก็บ Pact ไว้สำหรับ integration ที่ต้องการความสามารถนี้ หรือพิจารณาแนวทาง static comparison ใน bidirectional contract testing
Apidog แทน Pact consumer mocks ได้หรือไม่?
ได้สำหรับหลายกรณีใช้งาน
Smart mock server สร้าง response ตาม schema จาก spec และสามารถกำหนด custom expectations สำหรับข้อมูลเฉพาะได้ ทำให้ consumer ทำงานกับ contract URL ที่แชร์ร่วมกันแทนการเขียน mock-provider DSL
ดูภาพรวมเพิ่มเติมได้ที่ contract testing and mocking tools
แล้วการ fuzzing provider เทียบกับ spec ล่ะ?
Scenario tests ของ Apidog สามารถใช้ร่วมกับ spec-based property testing เพื่อเพิ่ม negative coverage ที่กว้างกว่าการ replay ตัวอย่าง
ดูการเปรียบเทียบได้ใน Schemathesis คืออะไร
PactFlow มีค่าใช้จ่ายเท่าไรเมื่อเทียบกับ Apidog?
PactFlow มี Starter tier ฟรีสำหรับ 2 integrations, Team tier ราคา 127 ดอลลาร์ต่อเดือนสำหรับ 50 integrations และ Enterprise เป็นราคาตามการปรับแต่ง
Apidog ฟรีสำหรับผู้ใช้สูงสุด 4 คน และแผนแบบเสียเงินเริ่มต้นที่ 9 ดอลลาร์ต่อผู้ใช้ต่อเดือน
หากกำลังเปรียบเทียบเครื่องมือ capture-replay ด้วย ดู ทางเลือกสำหรับ Keploy
เลิกพิธีรีตอง แต่รักษาสัญญาไว้
หากใช้ Pact เพื่อจับ schema drift เป็นหลัก คุณสามารถย้ายไปใช้ OpenAPI spec หนึ่งชุด แล้วบังคับใช้ผ่าน schema validation, CI scenarios และ shared mocks ได้
เริ่มต้นด้วยขั้นตอนนี้:
1. นำเข้า OpenAPI spec
2. สร้าง scenario tests สำหรับ endpoint สำคัญ
3. รัน apidog run ใน CI
4. แชร์ mock URL ให้ consumer
5. Review spec changes ก่อน merge
ดาวน์โหลด Apidog หรือเริ่มใช้งานผ่านเบราว์เซอร์ได้ทันที หากทีมมีไม่เกิน 4 คน แผนฟรีครอบคลุมการเริ่มต้นใช้งาน และช่วยลดภาระการดูแล broker ที่ไม่จำเป็น
Top comments (0)