ในการทดสอบระบบงานที่พัฒนาด้วย Spring Boot นั้น
จะมีแนวทางการใช้งานผ่าน Spring Boot Test
ซึ่งเป็น integration test ของระบบงาน
โดยจะทำสร้างและ load ข้อมูลต่าง ๆ ของระบบที่เรียกว่า bean เข้ามาใน context
ขึ้นมาบน memory ในรูปแบบของ key-value
การทำงานปกตินั้นตัว framework จะตัดสินใจให้เองว่า
ในแต่ละ test class จะทำการสร้าง หรือ reuse context ให้เอง
ดังนั้นอาจจะเกิดกรณีที่สร้างหลาย ๆ context ขึ้นมาพร้อม ๆ กัน
หรือการทดสอบแบบ parallel
ส่งผลให้ใน memory เยอะมาก ๆ
นำไปสู่ปัญหาเรื่อง OOM (out-of-menory) ได้
รวมทั้งการทดสอบที่ใช้เวลามากขึ้น
ดังนั้น เราควรต้องทำการ tunning หรือ optimization การทดสอบให้ดีขึ้น
มาเริ่มกันเลย
ก่อนอื่นต้องดูก่อนว่า ใน Spring Boot Test Context เป็นอย่างไร ?
เราสามารถทำการ visualize ออกมาเป็นรูปง่าย ๆ ด้วย Spring Test Profiler

ต่อมาทำการ optimization ใน Spring Boot Test กัน
ยกตัวอย่างเช่น
- ใช้ @DirtiesContext สำหรับการสร้างและลบ context ก่อนและหลังการทดสอบแต่ละ test case หรือ แต่ละ class หรือ suite เพื่อไม่ให้ context ในแต่ละ test มีปัญหา แต่อาจจะนำไปสู่การทดสอบที่นานขึ้น และ เปลือง memory
- ทำการกำหนดขนาดของ context ไปเลย เช่น spring.test.context.cache.maxSize=10 เป็นต้น
- ทำการสร้าง Integration class แม่ขึ้นมา เพื่อสร้าง bean ที่ต้อง reuse กัน
- ถ้าใครใช้ testcontainer ก็ใช้งานผ่าน static Docker container bean ได้เช่นกัน หรือถ้าสร้าง bean ที่กิน resource เยอะ ๆ ก็ใช้งาน Lazy initial ก็ได้
อีกหนึ่งวิธีการที่น่าสนใจคือ Spring Test Smart Context
เพื่อลดการสร้าง context ใน test ลงไป
แนวทางคือ การจัดการเรียงการสร้าง context ใหม่ก่อนทำการสร้าง
เพื่อให้ได้แนวทางการสร้างที่ดีที่สุด
จากนั้นทำการสร้าง context test และมี active ตัวเดียว
แสดงดังรูป

ซึ่งลดการใช้งาน resource ลงไปอย่างมาก

เป็นอีกแนวทางที่น่าสนใจมาก ๆ
สำหรับสายการเขียน test ใน Spring Boot ลองนำไปใช้งานกันดู
ขอให้สนุกกับการ testing