
จากการแบ่งปันเรื่องของการทดสอบ ไม่ว่าจะเป็น manual หรือ automated
จะให้ความสำคัญกับ test ที่ดีมาก ๆ
ยกตัวอย่างเช่น F.I.R.S.T principle เป็นต้น
โดยปัญหาหนึ่งของการทดสอบคือ ไม่จบในตัวเอง
หรือไม่เป็นอิสระจากส่วนอื่น ๆ ไม่ว่าจะเป็น test case อื่น ๆ ไม่ว่าจะการเตรียม data
และ external system (database, caching, messaging และ external api เป็นต้น)
ส่งผลทำให้การทดสอบไม่เสถียร หรือผ่านบ้าง ไม่ผ่านบ้าง ทั้ง ๆ ที่ไม่ได้แก้ไขอะไรเลย !!
ไม่ว่าจะทดสอบใน level ไหน สามารถประยุกต์ใช้ได้ทั้งหมด
ยกตัวอย่างของ test case ที่มีปัญหา แต่ดันเจอบ่อย ๆ
เขียน test case ด้วย NodeJS + Jest แบบง่าย ๆ ได้ดังนี้
จะเห็นได้ว่าจะต้องเรียงตามลำดับเสมอ คือ
- seed data หรือเตรียม data สำหรับการทดสอบทุก ๆ test case
- ทำการตรวจสอบข้อมูลใน database
- ทำการแก้ไขข้อมูล
- ทำการลบข้อมูล
ปัญหาที่ตามมาคือ จะต้องทดสอบเรียงลำดับเสมอ (sequential process)
ทำให้เวลาในการทดสอบสูงขึ้นเรื่อย ๆ
ไม่สามารถทำการทดสอบแบบ parallel ได้แน่นอน
รวมทั้งถ้าในขั้นตอนแรก ๆ มีปัญหา หรือ ไม่ผ่าน อาจจะส่งผลต่อ test อื่น ๆ อีก
ยิ่งถ้า seed data มีปัญหา ยิ่งซวยไปใหญ่ !!
ดังนั้นควรจัดการข้อมูลแยกไปแต่ละ test case ไปเลยดีกว่า
ที่สำคัญในการเตรียม data สำหรับการทดสอบมีหลายวิธี
อยู่ที่ความต้องการของการทดสอบนั้น ๆ เอง เช่น
- ทำการ mock หรือ stub หรือ fake ไปเลยก็ได้
- ทำการ setup ข้อมูลจริง ๆ เลย เช่นทำผ่าน data factory และ test container ไปเลย สำหรับ integration test
- หรือสามารถทำการจัดการตามที่เราต้องการ เช่น database ต่อจริงไปเลย ส่วน caching, messaging ทำการ mock ไปเลยเป็นต้น แน่นอนว่าตรวนี้ต้องวางแผนและออกแบบก่อนเสมอ
ยกตัวอย่างเช่น
เพียงเท่านี้ ก็สามารถจัดการ test case ให้จบในตัวเองได้เลย
จะช่วยทำให้ test case ต่าง ๆ มีความน่าเชื่อมากยิ่งขึ้น
และ test case จะอธิบายตัวมันเองด้วยว่า ทำงานร่วมกับระบบอะไรบ้าง อย่างไร
ลองปรับปรุงการทดสอบดูครับ
รู้ว่ามันไม่ง่าย แต่ถ้าไม่ปรับปรุงหรือเปลี่ยนแปลง ก็จะมีปัญหาเช่นเดิม
ปล. แต่เรามักจะขยันหาเหตุผลมากมาย เพื่อไม่ทำอีก !!