unit-test
ในการเขียน unit test นั้น สิ่งที่มักจะถามเสมอคือ
จะต้องเขียน unit test สำหรับ code ทุกส่วนเลยหรือไม่
ถ้าตอบแบบ Hard core หน่อยก็จะบอกว่า ใช่ เนื่องจาก code ทุกๆ ตัวอักษร
ที่เขียนขึ้นมานั้น ต้องมีเหตุผล เสมอ
นั่นคือ code ต้องมี unit test ก่อนเสมอ
แต่คำตอบนี้มันอาจจะดูโหดร้ายไปหน่อย
ดังนั้น มาดูคำตอบที่น่าจะเหมาะสมกับคำถามนี้กันดู

สิ่งหนึ่งที่คุณต้องทำก่อนการเขียน unit test หรือ test case ก็คือ การคิด (Think)
มากกว่าการเน้นไปที่ความสามารถของเครื่องมือที่ใช้งาน
โดยผมขอแนะนำดังนี้

1. เลิกคิดกับคำว่า Code Coverage 100% ไปได้เลย
มันไม่ใช่เป้าหมายของการเขียน unit test เลย
เป้าหมายที่แท้จริง มันคือ

  • ทำให้เราเข้าใจปัญหาที่เราต้องการแก้ไขมากยิ่งขึ้น
  • ทำให้เราสามารถ maintain code ได้ดีขึ้น ยิ่งตอนเจอ bug จะช่วยได้มาก

การเขียน unit test มักจะเลือกส่วนของระบบหลัก ที่มีการใช้งานปริมาณมาก หรือ ใช้งานอยู่ตลอด
ลองทำตามแนวทางนี้ จะพบว่า code ที่เขียนขึ้นมานั้นจะมีคุณภาพที่ดีขึ้น

2. ทำการ run unit test แบบอัตโนมัติ และ บ่อยๆ
ซึ่งเป็นหนึ่งแนวปฏิบัติที่สำคัญมากๆ ของ Continuous Integration (CI)
ที่สำคัญ unit test จะต้องใช้เวลาประมวลผลเพียงไม่กี่นาที

3.ในการสร้าง unit test นั้น จะต้องมีพื้นฐานอยู่บนการใช้งานที่เกิดขึ้น รวมทั้งขอบเขตของเงื่อนไขของปัญหานั้นๆ
โดยสิ่งที่ต้องคิดก่อนเสมอ คือ คุณต้องการทดสอบอะไร … ไม่ใช่ทดสอบอย่างไร

4. Unit test ทั้งหมดที่เขียนขึ้นมานั้น ต้องเป็นไปตามสิ่งที่กำหนดไว้ใน requirement

5.  ต้องจำไว้เสมอว่า unit test จะต้องไม่ผูกติดกับระบบต่างๆ
เช่น Database, File system เป็นต้น

6. อย่าเขียน unit test ไปซะหมดทุกที่ เช่น setter/getter method เป็นสิ่งที่ไร้ค่าอย่างมาก


สุดท้ายแล้ว
เมื่อเขียน unit test ขึ้นมา จำเป็นอย่างยิ่งที่ต้องมีการ review code
ทั้ง code ของ unit test และ production code
และสิ่งที่สำคัญมากๆ ก็คือ จะต้องคิดก่อนเสมอว่าใน requirement แต่ละข้อนั้น
จะมี test case อะไรบ้าง ก่อนที่จะทำการเขียน unit test ต่อไป