ในการทดสอบระบบงานพวก RESTful API นั้น ๆ
เราสามารถทดสอบได้หลายวิธี ไม่ว่าจะเป็น

  • API testing tools เช่น Postman
  • Unit, Integration, Component และ End-to-End testing

แต่อีกตัวที่น่าสนใจคือ Contract Testing
สำหรับการทดสอบการทำงานร่วมกันระหว่าง services ต่าง ๆ

พอดีมี project ต้องใช้งาน
จึงลองสรุป Contract testing ด้วย Spring Cloud Contract ไว้
โดยสามารถดูเพิ่มเติมใน Spring Cloud Contract Reference
จะสนับสนุนทั้ง HTTP และ messaging
มาเขียนกันเลย

ขั้นตอนที่ 1 เริ่มจากการออกแบบการทำงานของผู้ใช้งาน(Consumer)และผู้ให้บริการ (Provider)

โดยติดต่อกับผ่าน HTTP protocol ปกติด้วย REST + JSON
ซึ่งทั้ง consumer และ provider จะต้องมาสรุปรูปแบบของการติดต่อสื่อสาร
ว่าจะต้องมีรูปแบบอย่างไร
มันคือ API specification นั่นเอง
จะเรียกว่า Contract หรือสัญญาระหว่างกัน
ดังนั้นถ้ามีการเปลี่ยนสัญญาจะรู้ได้ทันที

ขั้นตอนที่ 2 ทำการสร้าง Contract ขึ้นมา ซึ่งสามารถ execute ได้ ไม่ใช่เป็นเพียงไฟล์เอกสารที่โยนไปมา

โดยสามารถสร้าง contract ได้หลายรูปแบบ
จะเรียกว่า Contract DSL ประกอบไปด้วย

  • Java
  • Groovy
  • Kotlin
  • YAML

ตัวอย่างของ Contract ที่เขียนด้วยภาษา Groovy

ขั้นตอนที่ 3 ในฝั่ง provider ทำการเขียน test โดยนำข้อมูลจาก Contract ที่สร้างไว้มาใช้

จะเรียกว่าการสร้าง Contract test
ในส่วนนี้เราจะเขียนเพียง Based-test class เท่านั้น
เพื่อระบุว่าเป็น class หลักของการทดสอบด้วย Contract ดังนี้

จากนั้นทำการ run test ผ่าน gradle ได้คำสั่ง

$gradlew contractTest

โดยคำสั่งนี้จะทำการ generate test case class จาก contract
ที่อยู่ใน folder contract ให้แบบอัตโนมัติ
และทำการทดสอบให้อีกด้วย

ขั้นตอนที่ 4 เมื่อฝั่ง provider ทำการทดสอบผ่านแล้ว ทำการสร้าง stub server และ upload ไปยังตรงกลาง

การสร้าง stub server จาก Contract นั่นเอง
เพื่อให้ทางฝั่ง consumer หรือผู้ใช้งานนำไปใช้
เพื่อใช้ในการทดสอบ หรือ มันคือ Mock API server นั่นเอง
ถูกสร้างมาให้ทุกครั้งเมื่อมีการเปลี่ยนแปลง

ขั้นตอนที่ 5 ในฝั่ง consumer ก็ทำการเขียน test case เพื่อใช้งาน Contract test + Stub server

ทำการใช้งาน stub server ที่สร้างจาก provider
และถูกจัดเก็บไว้ใน Apache Maven Repository แบบ local
เขียนได้ดังนี้

จากนั้นก็ทดสอบแบบปกติ
เพียงเท่านี้เราก็สามารถเริ่มต้นทำ Contract testing
ด้วย Spring Cloud Contract ได้แล้ว
เป็นอีกแนวทางในการทดสอบและการทำงานร่วมกันที่น่าสนใจ
ส่วนเครื่องมืออื่น ๆ ก็เช่น Pact เป็นต้น

ขอให้สนุกกับการ coding ครับ

ดูตัวอย่าง code แบบเต็ม ๆ ได้ที่ GitHub:Up1