Dojo_mocking_external_Apis
จากการพูดคุยเรื่อง การทดสอบ Facebook API
คำถามหลักคือ จะเขียนทดการทดสอบอย่างไรดีล่ะ ?

  • Unit/Integration/System test ?
  • ต้องทำการ Mock/stub ระดับ API หรือ service ?

ส่วนตัวผมมีแนวคิดสำหรับกรณีนี้ดังนี้

เริ่มต้นด้วยการทดสอบด้วยการต่อ Facebook API ตรง ๆ ไปเลย

เพื่อทำให้เราเข้าใจว่า Facebook API ทำงานอย่างไร
ทั้ง input ที่ต้องส่งไป
ทั้ง output ที่ได้รับกลับมา
รวมทั้งเรียนรู้การใช้งาน library ที่ทำงานกับ API อีกด้วย

แต่การเรียกใช้งาน API ตรง ๆ เลย มันก่อให้เกิดปัญหาหลาย ๆ อย่าง
ตัวอย่างเช่น

  • การควบคุมข้อมูล
  • ความเร็วของ Network
  • ข้อจำกัดในการใช้งาน API

ดังนั้นวิธีการแก้ไขปัญหามันมีหลายทางเลือก
ทั้งลงแรงเยอะ และ น้อย
ทั้งเขียน code เพิ่มเยอะ และ น้อย

วิธีการที่ผมชอบคือ เริ่มเขียนจากมุมมองของผู้ใช้งานก่อน !!

นั่นคือ สิ่งที่เราสนใจมันทำงาน และ ใช้งานอย่างไร
อาจจะมองในมุมของ feature ของระบบเลยก็ได้
ขอเรียกว่าเป็น Acceptance test
เช่น feature การดึง user profile จาก facebook
ดังนั้นเขียน acceptance test ง่าย ๆ ว่า

  • ทำการดึงข้อมูล user profile ของนาย กอไก่ มาจาก facebook
  • ข้อมูลที่ได้รับประกอบไปด้วย ชื่อนายกอไก่ นามสกุลไข่เยอะ

จาก Acceptance test นี้ มันทำให้เราเห็นว่าเป้าหมายคืออะไร
ไม่ต้องไปคิดเรื่องอื่นเยอะ
ให้สนใจที่ดึงข้อมูลชื่อและนามสกุลของ นายกอไก่จาก Facebook มาให้ได้ก่อน

แน่นอนว่า Acceptance test นี้มันทำงานไม่ได้
หรือทดสอบไม่ได้ และ ไม่ผ่านอยู่แล้ว
เพราะว่า เรายังไม่ทำการเขียน code อะไรขึ้นมาเลย !!

ดังนั้นเริ่มเขียน code กันเถอะ
ซึ่งให้ทำการเรียก Facebook API ตรง ๆ ไปเลย
จะได้ข้อมูลของนายกอไก่ถูกต้อง

จากปัญหาต่าง ๆ ข้างต้น ผมจึงพยายามทำให้ feature นี้มันทดสอบได้ง่ายขึ้น (Testable)

ซึ่งวิธีที่ผมชอบทำมี 2 ทาง คือ

  1. จำลอง Facebook API server ด้วยเครื่องมือต่าง ๆ เช่น Stubby4j และ WireMock เป็นต้น
  2. ใช้แนวคิด Stub และ Mock จาก test double มาใช้งาน

Dojo_mocking_external_dependancies

ทั้งสองแนวทางนั้น ต้องแก้ไข code เดิมให้ทดสอบได้ง่ายขึ้น
แน่นอนว่า code ดีขึ้นแน่นอน
และ code แต่ละส่วนควรมี Unit testing ครอบคลุมเสมอนะ
เพื่อทำให้เรารู้ว่า กำลังทำอะไร แก้ไขปัญหาอะไร และ จะทำงานเสร็จเมื่อไร

อย่าลืมว่า เรามี Acceptance test นะ
ถ้าให้ดีลองให้มันทำงานแบบอัตโนมัติดูสิ
น่าจะทำห้เรามั่นใจว่า สิ่งที่แก้ไขมันยังถูกต้อง หรือ ทำงานตามที่ตกลงกันไว้

ปล. ส่วนใหญ่วิธีการต่าง ๆ มันเกิดจากปัญหา
และการตั้งคำถามทั้งนั้นเลย (หัดตั้งคำถามให้ดี)
ส่วนวิธีการต่าง ๆ มันมีหลากหลายวิธีการ
ดังนั้น ให้ทดลองใช้วิธีการต่าง ๆ ก่อนว่า อะไรที่เหมาะสม

สุดท้ายคือ เราต้องตอบให้ได้ว่า

  • สิ่งทำนั้นมันทำให้เรามีความั่นใจมากขึ้นหรือไม่ ?
  • สิ่งที่ทำนั้นมันส่งผลกระทบอะไรกับระบบงานบ้าง ?
  • สิ่งที่ทำนั้นมันคุ้มต่อการลงทุนหรือไม่ ?
  • เมื่อสิ่งที่เราใช้งานเปลี่ยนแปลง เช่น Facebook API เปลี่ยนแปลง เรารู้หรือไม่ ว่าส่งผลกระทบต่อระบบอย่างไร ?

ให้เปลี่ยนจากความคิดที่ว่าจะทดสอบอย่างไร ?
เปลี่ยนเป็นว่า

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

ซึ่งมันจะทำให้เราเข้าใจความต้องการมากยิ่งขึ้น