ปัญหาที่พบเจอในการทดสอบระบบที่พัฒนาด้วย Spring Boot

เมื่อเริ่มเขียนชุดการทดสอบของระบบที่พัฒนาด้วย Spring Boot นั้น
ชีวิตก็จะสบายขึ้นมาเยอะ
เนื่องจาก Spring Boot ได้เตรียม Spring Boot Unit test หรือ Integration test มาให้อยู่แล้ว
แต่ขั้นตอนการทำงานภายในนั้น
มันจะทำการสร้าง context ขึ้นมาทุกครั้ง
ดังนั้นผลที่ตามมาคือ “ความช้า”
และนี่แหละคือปัญหาที่ต้องเจอ
จะแก้ไขหรือปรับปรุงอย่างไร เพื่อให้ทำการทดสอบได้รวดเร็วขึ้น

การแก้ไขในเบื้องต้นนั้น

จะพยายามเขียน Spring Boot Unit test (Slice testing) เท่าที่จำเป็นเท่านั้น
ส่วนเรื่องอื่น ๆ ในการ mock ด้วย Mockito กับ JUnit มาช่วย
ซึ่งทำการทดสอบได้อย่างรวดเร็ว
แต่ไม่การันตีว่า ระบบจะสามารถทำงานได้
เนื่องจากเป็นการทดสอบส่วนย่อย ๆ เท่านั้น

มาหาต้นเหตุของปัญหา

เมื่อใช้งาน Spring Boot Unit test แล้ว
ก็จำเป็นต้องรู้การทำงานภายในของมันหน่อย
ง่าย ๆ ก็แค่ debug เท่านั้นเอง

$mvn test -Ddebug

เนื่องจากเรามักจะใช้ @SpringBootApplication, @EnableAutoConfiguration และ @ComponentScan
ผลที่ได้คือ Spring Boot มัน load class ต่าง ๆ เยอะมากจนน่าเกลียด
ทั้ง class ที่ใช้งานและไม่ได้ใช้งาน
นี่คือต้นเหตุของปัญหา

การแก้ไขปัญหา

ก็ให้ทำการ load class เท่าที่จะใช้งาน
ซึ่งไม่ง่ายเลยเพราะว่า มันเยอะมาก ๆ
แต่ก็สามารถทำได้ด้วยการใช้ @Import เอง
โดย class ต่าง ๆ ก็เอามาจาก log จากด้านบนนั่นเอง
จากนั้นก็เลือกที่เราคิดว่า ต้องการใช้งาน
แล้วทำการทดสอบใหม่อีกครั้ง ถ้าทำงานได้เช่นเดิมก็รอดตัวไป
ยกตัวอย่างเช่น

จากการใช้งานนั้น โดยปกติจะใช้เวลาในการทดสอบประมาณ 1 นาที
เมื่อเปลี่ยนวิธีการตามข้างบนพบว่า เวลาเหลือเพียง 20 วินาที
โดยที่วิธีการนี้ใช้ได้ทั้งระบบงานหลักและการทดสอบ
มั่นใจได้ว่า เร็วขึ้นแน่นอน

อีกอย่างที่น่าสนใจคือ โดยปกติแล้วนั้น Spring Boot ใช้ Apache Tomcat
ต้องการใช้ Memory Heap ประมาณ 100 MB และมี Thread มากว่า 15 ตัว ใหญ่น่าดู
ดังนั้นเราสามารถทำงาน exclude Apache Tomcat ออกไป
แล้วใช้งาน Jetty หรือ Undertow แทน ก็จะดีขึ้นไปอีก

สุดท้ายแล้ว Spring Boot ถูกออกแบบมาสำหรับการทำ Service เล็ก ๆ หรือ Microservices
ดังนั้นขนาดของ Service เราเป็นอย่างไร ?
ตรงนี้น่าคิดมาก ๆ

ขอให้สนุกกับการ coding ครับ