มีคำพูดหนึ่งที่น่าสนใจคือ Unit test จริงๆ นั้นจะไม่ …
ทำงานกับระบบไฟล์ ( File system ) โดยตรง
เนื่องจากมองว่ามันเป็น dependency ที่ไม่สามารถควบคุมได้
ดังนั้น ถ้าเราต้องการเขียน unit test ที่ทำงานกับระบบไฟล์ล่ะ จะต้องทำอย่างไร
ผมจะยกตัวอย่างการเขียน unit test ด้วยภาษา Java นะครับ
วิธีการที่มักนิยมใช้กันประกอบไปด้วย
- ใช้ Rule ของ JUnit
- ใช้วิธีการ Mock object
- ใช้งาน Apache Common Virtual File System
แต่ละวิธีการนั้นมีแนวคิดเหมือนกันคือ
สร้างชั้นการทำงานหนึ่งขึ้นมา เพื่อไม่ให้ไปใช้ระบบไฟล์จริงๆ ( Abstraction layer )
เพื่อตัดสิ่งที่เกี่ยวข้องออกไป ( dependencies )
ส่งผลให้เราสามารถควบคุมทรัพยากรต่างๆ ของระบบงานเพื่อให้ทดสอบได้นั่นเอง
วิธีการที่จะอธิบายต่อไปนี้ คือวิธีแรก ซึ่งผมมักจะนำไปใช้งานเสมอ
การใช้งาน Rules ของ JUnit
แนววิธีการนี้คือ ทำการกำหนด Rules เพื่อกำหนดระบบไฟล์ชั่วคราวขึ้นมา
ซึ่งก็คือ temporary folder นั่นเอง ต่อจากนั้นก็ทำการสร้างไฟล์ที่ต้องการสำหรับการทดสอบได้เลย
ซึ่งข้อมูลจะหายไปหลังจากการทดสอบเสร็จสิ้น
เหมือนกับการใช้งาน folder /tmp นั่นเอง
เมื่อเข้าใจแนวคิดแล้วมาลองใช้งานกันดูบ้าง
เป็นตัวอย่างการอ่านข้อมูลจากไฟล์ เพื่อนำมาแบ่งข้อมูล
โดยมีขั้นตอนดังนี้
ขั้นตอนที่ 0 ต้องใช้ JUnit 4.7 ขึ้นไปนะ
ขั้นตอนที่ 1 ทำการสร้าง temporary folder ขึ้นมา ซึ่งเป็น APIs ของ JUnit ดังนี้
ซึ่งจะใช้ @Rule กำหนด
ขั้นตอนที่ 2 ทำการสร้างไฟล์และข้อมูลที่ต้องการทดสอบทุกๆ ครั้งก่อนเข้าทำงานในแต่ละ test case
โดยใช้ @Before ดังนี้
จากตัวอย่างทำการสร้างไฟล์ชื่อว่า input.txt และมีข้อมูลคือ 1,2,3,4,5
ขั้นตอนที่ 3 ทำการเขียน test case ตามใจชอบของเรา
โดยผมทำการเขียนการทดสอบมา 3 test case ประกอบไปด้วย
- ตรวจสอบว่ามีไฟล์อยู่หรือไม่
- ตรวจสอบว่าข้อมูลที่อ่านมาจากไฟล์มีความยาวมากกว่า 0
- ตรวจสอบการตัดข้อมูลแบบ CSV ว่ามีขนาดตามที่ต้องการหรือไม่
สามารถเขียน code ได้ดังนี้
เพียงเท่านี้ก็สามารถจัดการกับระบบไฟล์ใน unit test ได้แบบง่ายๆ แล้ว
ลองนำไปใช้งานกันดูครับ