โดยปกติการทดสอบในระดับ integration test และ component นั้น
มักจะทดสอบผ่านระบบจริง ๆ ซึ่งควบคุมได้ยาก
ยกตัวอย่างเช่น การทดสอบกับ Database, Data store
รวมไปถึงการทดสอบระดับ UI/Acceptance test ซึ่งต้องทดสอบผ่าน browser
แน่นอนว่า การจัดการนั้นไม่ง่ายเลย
แต่เมื่อเข้าสู่ยุคของ container แล้วนั้น
เรื่องต่าง ๆ เหล่านี้จะง่ายขึ้น แต่แลกมาด้วยการเรียนรู้และเครื่องที่แรงขึ้น
หนึ่งในเครื่องมือนั้นคือ
Test containers
ซึ่งเป็น library ที่พัฒนาด้วยภาษา Java 1.8
ที่สำคัญคือ ใช้งานร่วมกับ
JUnit ได้เลย
เหมาะมากสำหรับการทดสอบระบบงาน
ปล. เครื่องทดสอบต้องติดตั้ง Docker 17.06 ด้วยนะ และ JDK 1.8 ขึ้นไป
ดังนั้นมาเริ่มใช้งานกันหน่อย
น่าจะเป็นอีกหนึ่งแนวทางสำหรับการพัฒนาและทดสอบระบบงาน
ให้มีคุณภาพและลดความเสี่ยงต่าง ๆ ลงไป
ยกตัวอย่างการใช้งานกับ Spring Boot
สำหรับการทำงานร่วมกับ Database ผ่าน
Spring Data JPA
ปกติเราสามารถทดสอบผ่าน @DataJpaTest ได้เลย
ซึ่งนั่นก็คือการทดสอบผ่าน Embedded database เช่น H2 เป็นต้น
แต่ว่า Database จริง ๆ ไม่ใช่ Embedded database แน่นอน
ยกตัวอย่างเช่น MySQL และ PostgreSQL เป็นต้น
ซึ่งอาจจะส่งผลให้การทดสอบผิดพลาดหรือต่างไปจากของจริงก็เป็นไปได้มาก
ดังนั้นถ้าใช้ Database จริง ๆ เหมือนกับ production กันเลยไหม
โดยสามารถใช้ผ่าน Test container ได้ดังนี้
ขั้นตอนที่ 1 เพิ่ม dependency หรือ libray ของ Test containers เข้าไปก่อน
ขั้นตอนที่ 2 ทำการกำหนด Image ของ database ที่ต้องการใช้ผ่าน Test containers
เลือกใช้งาน PostgeSQL
รวมทั้งกำหนดชื่อฐานข้อมูลและ username/password ให้เรียบร้อย
ผ่านส่วนของ @ClassRule ของ Unit ดังนี้
[gist id="f6d306e654c6c648692995bac1a9a5b7" file="HelloContainerTest1.java"]
ขั้นตอนที่ 3 ทำการกำหนด class Initialzer สำหรับ Spring Boot
เพื่อให้ชุดการทดสอบไปเรียกใช้งาน Database ที่เรากำหนดไว้ในขั้นตอนที่ 2
[gist id="f6d306e654c6c648692995bac1a9a5b7" file="HelloContainerTest2.java"]
ขั้นตอนที่ 4 เขียนชุดการทดสอบและ run มันซะ
[gist id="f6d306e654c6c648692995bac1a9a5b7" file="HelloContainerTest3.java"]
เพียงเท่านี้เราก็สามารถทดสอบระบบผ่าน Test containers ได้แล้ว
ซึ่งง่ายขึ้นเยอะเลย แต่มันยังเป็น alpha version อยู่นะ
ขอให้สนุกกับการ coding ครับ