คำถามที่น่าสนใจ สำหรับการพัฒนาและทดสอบระบบงาน
หนึ่งในนั้นคือ เราควรจะ Mock หรือ ไม่ Mock พวก dependency ดี ?
เป็นคำถามที่ตอบได้ยากมาก ๆ
เนื่องจากมันขึ้นอยู่กับ context ที่พบเจอด้วย
แต่สิ่งที่เราควรต้องตอบให้ได้ว่า
เราจะ Mock พวก dependency ต่าง ๆ ไปทำไม
เพราะว่าใช้ของจริงไปเลยสิ มันจริงกว่า ถูกต้องกว่า !!
ก่อนอื่นแนะนำให้เข้าใจก่อนว่า Mock มันคือ
หนึ่งในรูปแบบหนึ่งของการจำลอง dependency
ซึ่งเราจะเรียกว่า Test Double มีทั้ง
- Dummy
- Stub
- Spy
- Mock
- Fake
มีเป้าหมายเพื่อทดสอบการทำงานในส่วนที่สนใจ
โดยที่สามารถกำหนดสถานการณ์ หรือ หรือจำลองผลการทำงานของ dependency
ให้เป็นไปตามที่เราต้องการ ทั้ง success และ fail
โดยสามารถใช้งานได้ในการทดสอบแต่ละชนิดด้วย เช่น
- Unit test
- API test
- UI test
ผลที่ตามมาคือ เราสามารถทดสอบการทำงานในแต่ละส่วนได้รวดเร็วขึ้น
การทดสอบสามารถทำซ้ำ ๆ ได้บ่อยตามที่เราต้องการ
แต่ถ้าทำการจำลอง dependency มากเกินไป
หรือลงรายละเอียดมากไป
ก็จะทำให้เกิดปัญหาได้ ลองอ่านเพิ่มเติมได้ที่ Mocking is a code smell
เนื่องจากการจำลองมันก่อให้เกิดปัญหาดังนี้
- มักจะมีสิ่งที่เพิ่มเข้ามาในการจำลองมากกว่าของจริง เช่น property/method เป็นต้น
- ทำการ return ข้อมูลต่างจากของจริง
- มีการทำงานที่แตกต่างจากของจริง
- หนักกว่านั้น เมื่อของจริงมีการเปลี่ยนแปลง ในส่วนของการจำลองไม่เป็น ปัญหาเกิดแน่นอน
- ยิ่งมี dependency มาก ๆ ยิ่งทรมาน ดังนั้นควรกลับไปดูการออกแบบแล้ว ว่าทำไมมี dependency เยอะแบบนั้น
ดังนั้นอาจจะต้องดูด้วยว่า สิ่งที่เราต้องการคืออะไรกันแน่
มันจะช่วยเราหรือทำร้ายมากกว่ากัน
จากนั้นทำการเลือก และลงมือทำ วัดผล
ว่าสิ่งที่คิด และผลที่ออกมาหลังการลงมือทำเป็นอย่างไร
เพื่อปรับปรุงต่อไป
ยกตัวอย่างเช่น
เราสนใจที่ business logic เป็นหลัก เนื่องจากมีความซับซ้อน
ดังนั้นจึงพยายามที่จะจำลอง dependency ที่ถูกใช้งาน
เช่น database, external api เป็นต้น
แต่ถ้าสามารถทดสอบกับระบบจริง ๆ ได้หรือบ่อยที่สุด จะเป็นสิ่งที่ดีที่สุด
สุดท้ายแล้ว จำเป็นต้องยก use case และสิ่งที่ต้องการมาเป็นที่ตั้ง
จากนั้นจึงมาพูดคุย ออกแบบ วางแผนกัน
ว่าควรจะใช้หรือไม่ใช้
น่าจะเป็นแนวทางที่เหมาะสมกว่า