junit

มีคำพูดหนึ่งที่น่าสนใจคือ Unit test จริงๆ นั้นจะไม่ …
ทำงานกับระบบไฟล์ ( File system ) โดยตรง
เนื่องจากมองว่ามันเป็น dependency ที่ไม่สามารถควบคุมได้
ดังนั้น ถ้าเราต้องการเขียน unit test ที่ทำงานกับระบบไฟล์ล่ะ จะต้องทำอย่างไร

ผมจะยกตัวอย่างการเขียน unit test ด้วยภาษา Java นะครับ

วิธีการที่มักนิยมใช้กันประกอบไปด้วย

แต่ละวิธีการนั้นมีแนวคิดเหมือนกันคือ
สร้างชั้นการทำงานหนึ่งขึ้นมา เพื่อไม่ให้ไปใช้ระบบไฟล์จริงๆ ( Abstraction layer )
เพื่อตัดสิ่งที่เกี่ยวข้องออกไป ( dependencies )
ส่งผลให้เราสามารถควบคุมทรัพยากรต่างๆ ของระบบงานเพื่อให้ทดสอบได้นั่นเอง

Screen Shot 2557-07-13 at 2.50.11 PM

วิธีการที่จะอธิบายต่อไปนี้ คือวิธีแรก ซึ่งผมมักจะนำไปใช้งานเสมอ

การใช้งาน 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 ประกอบไปด้วย

  1. ตรวจสอบว่ามีไฟล์อยู่หรือไม่
  2. ตรวจสอบว่าข้อมูลที่อ่านมาจากไฟล์มีความยาวมากกว่า 0
  3. ตรวจสอบการตัดข้อมูลแบบ CSV ว่ามีขนาดตามที่ต้องการหรือไม่

สามารถเขียน code ได้ดังนี้

เพียงเท่านี้ก็สามารถจัดการกับระบบไฟล์ใน unit test ได้แบบง่ายๆ แล้ว
ลองนำไปใช้งานกันดูครับ