บทนำ
ในยุคที่สถาปัตยกรรมแบบ Microservices กำลังได้รับความนิยมเพิ่มขึ้น การสื่อสารระหว่างบริการ (service) ต่าง ๆ กลายเป็นเรื่องสำคัญที่ต้องดูแลอย่างดี และนี่คือจุดที่ Contract Testing เข้ามามีบทบาทสำคัญในการตรวจสอบว่าการสื่อสารเหล่านั้นยัง “ตรงตามข้อตกลง” อยู่เสมอ บทความนี้จะพาคุณเข้าใจว่า Contract Testing คืออะไร ทำงานอย่างไร และนำไปใช้ในระบบ Microservices ได้อย่างไร
Contract Testing คืออะไร?
Contract Testing เป็นการทดสอบข้อตกลง (contract) ระหว่าง 2 ระบบ หรือ 2 บริการ (เช่น consumer และ provider) ว่ามีการสื่อสารกันตามที่ตกลงไว้หรือไม่ โดยไม่จำเป็นต้องรันทดสอบผ่านระบบจริงทั้งหมด
แตกต่างจาก Integration Testing ที่เน้นทดสอบระบบโดยรวม Contract Testing เน้นเฉพาะ “การสื่อสารและรูปแบบข้อมูลที่ตกลงกันไว้”
โครงสร้างพื้นฐานของ 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 เบื้องต้น
- Consumer เขียน Pact contract
- Provider ใช้ contract นี้ทดสอบย้อนกลับ
- ใช้
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