Contract Testing คืออะไร ใช้กับ Microservices อย่างไร

Sharing is caring!

บทนำ

ในยุคที่สถาปัตยกรรมแบบ Microservices กำลังได้รับความนิยมเพิ่มขึ้น การสื่อสารระหว่างบริการ (service) ต่าง ๆ กลายเป็นเรื่องสำคัญที่ต้องดูแลอย่างดี และนี่คือจุดที่ Contract Testing เข้ามามีบทบาทสำคัญในการตรวจสอบว่าการสื่อสารเหล่านั้นยัง “ตรงตามข้อตกลง” อยู่เสมอ บทความนี้จะพาคุณเข้าใจว่า Contract Testing คืออะไร ทำงานอย่างไร และนำไปใช้ในระบบ Microservices ได้อย่างไร

Contract Testing คืออะไร?

Contract Testing เป็นการทดสอบข้อตกลง (contract) ระหว่าง 2 ระบบ หรือ 2 บริการ (เช่น consumer และ provider) ว่ามีการสื่อสารกันตามที่ตกลงไว้หรือไม่ โดยไม่จำเป็นต้องรันทดสอบผ่านระบบจริงทั้งหมด

แตกต่างจาก Integration Testing ที่เน้นทดสอบระบบโดยรวม Contract Testing เน้นเฉพาะ “การสื่อสารและรูปแบบข้อมูลที่ตกลงกันไว้”

Consumer-Provider Contract Testing Diagram

โครงสร้างพื้นฐานของ Contract

  • Provider: ฝั่งที่ให้ API
  • Consumer: ฝั่งที่เรียกใช้งาน API
  • Contract: เอกสารที่อธิบายรูปแบบการเรียก (request/response)

Consumer-Driven Contract (CDC)

แนวทางที่นิยมคือ Consumer-Driven Contract คือให้ Consumer เป็นผู้ระบุว่าคาดหวัง response แบบใดจาก Provider แล้วสร้างสัญญาขึ้นมาเพื่อใช้ในการทดสอบย้อนกลับ

ตัวอย่างการเขียน Pact Contract:

{
  "provider": { "name": "UserService" },
  "consumer": { "name": "OrderService" },
  "interactions": [{
    "description": "get user by id",
    "request": {
      "method": "GET",
      "path": "/users/123"
    },
    "response": {
      "status": 200,
      "body": {
        "id": 123,
        "name": "Alice"
      }
    }
  }]
}

ประโยชน์ของ Contract Testing ใน Microservices

  • ตรวจจับการเปลี่ยนแปลงที่กระทบกับระบบอื่นได้เร็ว
  • ลดความจำเป็นต้องมี end-to-end test สำหรับทุก combination
  • เพิ่มความมั่นใจในการ deploy แต่ละบริการแบบอิสระ
  • รองรับ CI/CD ได้ดี

เครื่องมือยอดนิยม

  • Pact – ใช้งานง่าย รองรับหลายภาษา เช่น JavaScript, Java, Go, .NET
  • Spring Cloud Contract – เหมาะสำหรับ Spring Boot
  • Hoverfly / WireMock – ใช้จำลองบริการ

Pact Broker Example

การใช้งาน Pact เบื้องต้น

  1. Consumer เขียน Pact contract
  2. Provider ใช้ contract นี้ทดสอบย้อนกลับ
  3. ใช้ Pact Broker แชร์ contract ระหว่างทีม

ตัวอย่าง Workflow ใน CI/CD

  • Consumer push contract → Pact Broker
  • Provider fetch contract และรันทดสอบ
  • ถ้าผ่านทั้งหมด → merge และ deploy ได้

ข้อควรระวัง

  • อย่าให้ contract ซับซ้อนเกินไป – ควรสะท้อนพฤติกรรมจริง
  • ควร update contract ทันทีเมื่อเปลี่ยน API
  • ควรใช้ Pact หรือ Spring Cloud Contract อย่างมีวินัย

สรุป

Contract Testing เป็นเทคนิคที่สำคัญและจำเป็นมากสำหรับทีมที่ใช้ Microservices เพราะช่วยตรวจสอบความเข้ากันได้ของบริการต่าง ๆ โดยไม่ต้องรันระบบทั้งหมดร่วมกัน ช่วยให้พัฒนาและ deploy บริการแบบอิสระได้อย่างมั่นใจและปลอดภัย

บทความนี้ใช้เวลาอ่านประมาณ 10 – 15 นาที เขียนโดยทีมงาน poolsawat.com

Leave a Reply

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *