SystemUnderTest
จากการพูดคุยกับหลายทีม พบว่า
ปัญหาอย่างหนึ่งที่มักพบเจอคือ
การเชื่อมต่อกับระบบต่าง ๆ ผ่าน REST APIs
หรือแม้แต่การพัฒนาระบบเดียวกันที่ต้องแบ่งเป็น 2 ทีม คือ

  1. ทีม Frontend อาจจะเป็น Web หรือ Mobile ก็ได้
  2. ทีม Backend หรือ ทีม API

เนื่องจากต้องทำการเชื่อมต่อ และ integrate กันตลอด
ถ้า API ยังพัฒนาไม่เสร็จล่ะ ?
ถ้าระบบ network มันล่มล่ะ ?
ถ้าระบบ API มันล่มล่ะ ?

คำถามคือ จะแก้ไขปัญหาเหล่านี้อย่างไรดี ?

ก่อนที่จะไปหาเครื่องมือมาช่วยเหลือ ต้องเริ่มจากการคิด และ คุยรายละเอียด

ว่าในแต่ละ API เป็นอย่างไร เช่น

  • Endpoint ของ API
  • Input ของ API เป็น GET/POST/PUT/DELETE
  • Output ของ API
  • รูปแบบข้อมูลเป็น XML หรือ JSON

ซึ่งเป็นข้อตกลงร่วมกันก่อนเริ่มทำงาน

จากนั้นเราสามารถใช้เครื่องมือต่าง ๆ มาจำลองการทำงานของ API ได้เลย
ระหว่างที่รอให้ API พัฒนาเสร็จ
ที่สำคัญทีมพัฒนาสามารถควบคุมข้อมูลได้อีกด้วย
ดังนั้น ทีมพัฒนาจะไม่มีข้ออ้างว่า API ไม่เสร็จอีกต่อไป
ซึ่งมีเครื่องมือมากมาย โดยที่ผมมักจะใช้งานมี 2 ตัวคือ

  1. WireMock
  2. Stubby4j

แสดงการทำงานดังรูป

wiremock2

มาดูตัวอย่างการใช้งาน WireMock กันนิดหน่อย

1. ทำการติดตั้ง

เพียงแค่ download และนำมาติดตั้งไปที่ Servlet Container
หรือ run แบบ Standalone ก็ได้
โดยผมจะใช้การ run แบบ Standalone เพื่อความง่าย

ให้ทำการ download ไฟล์ JAR จาก WireMock Standalone

จากนั้นทำการ run ด้วยคำสั่ง

$java -jar wiremock-1.57-standalone.jar --verbose

แสดงผลการทำงานดังรูป

wiremock-03

โดยค่า default นั้นจะทำงานที่ port 8080
แต่เราสามารถเปลี่ยน port ได้ด้วยคำสั่ง

$java -jar wiremock-1.57-standalone.jar --port 9090 --verbose

สามารถดูการใช้งานเพิ่มเติมได้ที่ Running standalone

เมื่อ run WireMock เรียบร้อยแล้วจะสร้าง folder ขึ้นมา 2 folder คือ

  1. __files
  2. mappings

2. การใช้งานส่วนของ Admin

เข้าไปที่ url http://localhost:8080/__admin/
เพื่อดูว่า mapping ต่าง ๆ ของ API ใน WireMock มีอะไรบ้าง
แน่นอนว่า ตอนเริ่มต้นต้องไม่มีอะไรเลย
แสดงดังรูป

wiremock-04

3. มาสร้าง Mock API กันดีกว่า

ความต้องการของผมคือ
สร้าง API สำหรับการคงข้อมูลสินค้า ดังนี้

  • Endpoint = /products
  • ใช้งานผ่าน HTTP GET
  • Response ที่ส่งกลับมาอยู่ในรูปแบบของ JSON ซึ่งประกอบไปด้วย id, name, price ของสินค้า

ดังนั้นให้ทำการสร้างไฟล์ชื่อว่า product.json ใน folder mappings ดังนี้

จากนั้นทำการ restart WireMock
แล้วเข้าไปในส่วนของ Admin จะแสดงดังนี้

wiremock-05

4. ใช้งานจริง ๆ กันดีกว่า

สามารถเข้าใช้งานผ่าน URL http://localhost:8080/products
แสดงผลการทำงานดังนี้

wiremock-06

หรือสามารถทดสอบผ่าน Postman หรือ REST Client หรือ Curl ก็ได้นะ
เลือกได้ตามความสะดวกของแต่ละคน

เพียงเท่านี้ก็สามารถจำลอง API Server ด้วย WireMock กันได้แล้วนะ

ส่วน Stubby4J ก็ทำการติดตั้งและใช้งานคล้าย ๆ กัน

ต่างกันเพียงรูปแบบของไฟล์ configuration และ รูปแบบข้อมูล
ซึ่งอยู่ในรูปแบบของ YAML
จากการใช้งาน Stubby4J จะ configuration API ง่ายกว่า WireMock พอสมควร
แต่ขอแนะนำให้ลองด้วยตนเองนะครับ

มีคนถามว่า ถ้า API พัฒนาเสร็จแล้ว มีการเปลี่ยนแปลงจากที่ตกลงกันไว้ล่ะ ?

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

ซึ่งเป็นประเด็นที่สำคัญมาก ๆ
คุณรู้หรือไม่ว่า การเปลี่ยนแปลงต่าง ๆ มันส่งผลกระทบอะไรบ้าง ?

และยังมีเครื่องมืออื่น ๆ ให้ลองใช้งานอีกมากมาย

ไม่ว่าจะเป็น