Software Testing in Microservices
การทดสอบใน microservices จะเปลี่ยนไป เนื่องจากใน microservices จะเน้นการ communication ระหว่าง service มากกว่า ดังนั้นเราจะให้ความสำคัญกับการทำ Integration test มากกว่าการ testing ใน รูปแบบอื่นๆ
Software Testing
ก่อนอื่นเรามาทำความเข้าใจการทดสอบหรือการทำ Software testing ในระบบที่เป็น monolith ก่อนว่ามีการทดสอบในรูปแบบไหนกันบ้าง
จากรูปเราจะแบ่งการทดสอบออกเป็น 3 กลุ่มใหญ่คือ
-
Unit Testing เป็นการทดสอบ logic ว่าฟังก์ชั่นทำงานถูกต้องหรือไม่สิ่งที่สำคัญมากๆในการทำ unit testing คือเราต้อง isolate หรือแยก function ที่เราต้องการทดสอบออกไป ไม่ให้เชื่อมต่อกับ services อื่นๆ เช่น database หรือ mail server ดังนั้นการทำ unit testing เราเลยต้องทำการ mock service อื่นๆที่ต้องการเชื่อมต่อ เพื่อให้สามารถทำงานต่อเนื่องได้โดยไม่ติดขัด
-
Integration Testing หรือ service level testing เป็นการทดสอบที่ต่อจาก unit testing โดยเราจะทำการเชื่อมต่อกับ database จริงๆ แต่การทดสอบใน level นี้ก็จะยัง mock service ที่เป็น external service ไว้ เพื่อที่จะได้ focus แค่ระบบที่เรากำลัง implement อยู่เท่านั้น
-
System Testing เป็นการทดสอบการทำงานของระบบจริงๆ โดยที่การทำ system test จะเน้นการทดสอบว่าระบบนั้นใช้ได้หรือไม่เมื่อเชื่อมต่อกับระบบอื่นๆ การทดสอบนี้จะเน้นจำลองการทำงานจริง โดยแบ่งวิธีการทดสอบออกเป็น
- UI Testing การเขียน script หรือ บันทึก user action เพื่อจะได้จำลองการทำงานของคนที่เข้ามาใช้งานระบบ
- Api Testing เป็นการทดสอบระบบโดยไม่ได้สนใจ UI แต่เรียกใช้ API เชื่อมต่อไปเรื่อยๆ
ในการทดสอบระบบที่เป็น monolith นั้นจะให้ความสำคัญกับ unit testing มากๆ โดยถึงขั้นมีคนพูดว่า คุณภาพของระบบขึ้นอยู่กับคุณภาพของ unit test ส่วน integration test นั้นก็จะมีน้่อยกว่า unit test แต่ก็จะมากกว่า system test หรือ UI test ซึ่ง pyramid shape ถือว่าเป็น best practices ที่ทีม development จะพยายามทำให้ได้ตาม shape นี้คือมี unit test เยอะๆ UI Test น้อยๆ
เหตุผลที่เราต้องการ unit test เยอะๆเพราะว่า การทดสอบด้วย unit test นั้นทำงานได้เร็วมากและจะทดสอบเฉพาะจุดเล็กๆดังนั้นโอกาสที่ test case นั้นๆได้รับผลกระทบจากการเปลี่ยนแปลง requirement นั้นมีน้อย
ในขณะที่ UI testing นั้นค่อนข้างจะ sensitive เมื่อเปลี่ยน UI คุณอาจต้องแก้ script เพื่อให้ UI Testing นั้นกลับมาใช้งานได้ และอีกเหตุผลที่สำคัญมากๆคือ UI Testing เป็นการจำลองการใช้งานจริงดังนั้นการทำ UI Testing จะใช้เวลานานกว่าการทดสอบแบบอื่นๆ เพราะต้องเชื่อมต่อระบบจริง เกิด latency ของ network จริงๆ
การทดสอบใน Microservices Architecture
การทดสอบบน Microservices Architecture นั้นต้องเพิ่มเรื่องของ integration test ให้มากๆ เนื่องจากใน microservices นั้นมีการสื่อสารค่อนข้างเยอะ ดังนั้นปัญหาส่วนใหญ่ที่เราจะเจอใน microservices ก็คือการสื่อสารที่ผิดพลาดนี่แหละ เช่น order service เปลี่ยนชื่อของ parameters ที่ส่งเข้ามา service อื่นๆที่คุยกับ order service ก็จะได้รับผลกระทบจากการเปลี่ยนแปลงนี้ไปด้วย
เนื่องจากเวลาที่เรากด UI ก็จะเกิดการ call API หลังบ้านดังนั้นการทดสอบที่ได้ผลดีมากๆคือการทดสอบ API โดยตรง ไม่ต้องผ่าน UI นอกจากจะไม่ต้องกังวลกับการเปลี่ยนแปลงหน้า UI แล้วเรายังจะได้การทดสอบที่ครบถ้วนมากขึ้นเนื่องจากไม่มี UI มากำกับการทำงาน เช่น ถ้าหลังจากที่เรากดปุ่มแล้วให้ปุ่มนั้นหายไป เราอาจคิดว่านั่นเพียงพอแล้ว และลืมไปว่าเราสามารถ Copy การส่ง Request ไปยัง API มา run ซำ้ไปง่ายๆ
ดังนั้นเมื่อเราออกแบบระบบให้เป็น microservices เราจะเน้นการทดสอบที่ API เป็นหลักจน UI Testing เป็น Optional คือจะมีหรือไม่มีก็ได้