DEV Community

Cover image for ทางเลือก Pact ที่ดีที่สุด
Thanawat Wongchai
Thanawat Wongchai

Posted on Originally published at apidog.com

ทางเลือก Pact ที่ดีที่สุด

Pact เป็นเครื่องมือสำหรับการทดสอบสัญญาแบบ consumer-driven: ฝั่งผู้บริโภค (consumer) เขียน unit test เพื่อสร้างสัญญา ฝั่งผู้ให้บริการ (provider) เล่นซ้ำสัญญานั้นกับโค้ดจริง, Pact Broker เก็บผลการตรวจสอบ และ can-i-deploy บอก pipeline ว่าเวอร์ชันนั้นปลอดภัยต่อการ deploy หรือไม่ วิธีนี้ช่วยตรวจจับปัญหาการรวมระบบที่ unit test แบบแยกส่วนตรวจไม่พบ แต่แลกมาด้วย DSL สำหรับแต่ละภาษา, provider states ที่ต้องดูแล, broker ที่ต้องจัดการ และการแก้ปัญหา verification ที่รันซ้ำในเครื่องได้ยาก

ลองใช้ Apidog วันนี้

สำหรับทีมที่ปัญหาหลักคือ 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 หลักดังนี้

  1. Consumer รัน test กับ Pact mock provider
  2. Test บันทึกคู่ request/response เป็นไฟล์ pact
  3. Provider เล่นซ้ำ interaction เหล่านั้นกับ implementation จริง
  4. Provider states เตรียมข้อมูลสำหรับแต่ละ interaction
  5. Broker เก็บผล verification และใช้ตรวจสอบก่อน deploy

ตัวอย่างคำถามที่ Pact Broker ตอบได้คือ:

can-i-deploy \
  --pacticipant billing-service \
  --version 2.4.0 \
  --to-environment production
Enter fullscreen mode Exit fullscreen mode

ตามเอกสาร 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

แนวคิดหลักคือ:

  1. ใช้สัญญาเพียงชุดเดียว

    OpenAPI spec คือข้อตกลงร่วมระหว่าง provider และ consumer ไม่ต้องสร้าง pact file แยกตามภาษา

  2. ตรวจ schema ทุกครั้งที่รัน

    Response ที่ไม่ตรงกับ schema เช่น เปลี่ยนชื่อ field, เปลี่ยน type หรือเอา required property ออก สามารถทำให้ test ล้มเหลวได้ทันที

  3. เริ่มพัฒนา consumer จาก mock ได้เร็ว

    เมื่อกำหนด endpoint และ schema แล้ว ทีม frontend หรือ downstream สามารถใช้ mock จาก spec ได้ก่อน provider implementation จะเสร็จ

  4. บังคับใช้ใน 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
Enter fullscreen mode Exit fullscreen mode

แนวทางนี้ไม่ได้ให้ 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 คือ:

  1. สร้าง OpenAPI spec สำหรับ API
  2. สร้าง scenario tests สำหรับ endpoint สำคัญ
  3. เปิด schema validation
  4. รัน scenario ด้วย CLI ในทุก provider build

ตัวอย่าง scenario ที่ควรมี:

GET /users/{id}
- ส่งคำขอด้วย id ที่มีอยู่
- ตรวจสอบ status code = 200
- ตรวจสอบ response ตรงกับ User schema
- ตรวจสอบ required properties
Enter fullscreen mode Exit fullscreen mode

Provider ยังคงถูกตรวจเทียบกับสัญญา แต่ไม่ต้องสร้าง provider state handler ตาม interaction ของ consumer

3. การพัฒนาฝั่ง consumer

Pact ให้ consumer แต่ละรายสร้าง mock provider ภายใน test ของตัวเอง

Apidog ให้ mock URL ที่สร้างจาก spec และแชร์ข้ามทีมได้:

Frontend app
   |
   +--> Apidog Mock Server
            |
            +--> OpenAPI Spec
Enter fullscreen mode Exit fullscreen mode

ใช้ 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
Enter fullscreen mode Exit fullscreen mode

ขั้นตอนที่ 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 ได้:

  1. ย้าย test หรือ environment ของ consumer ไปที่ mock URL
  2. ยืนยันว่า response ตรงกับ use case
  3. ลบ DSL และ Pact mock setup เดิม
  4. ทำซ้ำกับ 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
Enter fullscreen mode Exit fullscreen mode

ดาวน์โหลด Apidog หรือเริ่มใช้งานผ่านเบราว์เซอร์ได้ทันที หากทีมมีไม่เกิน 4 คน แผนฟรีครอบคลุมการเริ่มต้นใช้งาน และช่วยลดภาระการดูแล broker ที่ไม่จำเป็น

Top comments (0)