คำถามที่คุณอาจจะถามตัวเอง ซึ่งผมก็เคยถามและตอบตัวเองไปแล้ว ดังนี้
คำถาม
ถ้าเราทำ integration และ system test ไปแล้ว ทำไมจะต้องทำ unit test ด้วยล่ะ ?
คำตอบก็คือ มันเรียบง่ายไงล่ะ …
มีทางเดียวที่คุณจะรู้ว่าแต่ละบรรทัดของ code ที่คุณเขียนมานั้น
มันทำงานเป็นไปตามความคาดหวังหรือไม่
นั่นก็คือ การเขียน unit test นั่นเอง
ส่วนการทดสอบในระดับที่สูงกว่าก็เพราะว่า
ระบบงานคือการรวมของหลายๆ ส่วนมาทำงานร่วมกัน
ซึ่งไม่สามารถที่จะใช้ unit test ตรวจสอบการทำงานได้
หรือถ้าได้ก็ใช้ความพยายามสูงมากๆ
ดังตัวอย่างเช่น
ถ้าระบบของคุณมีการทำงานดังนี้
คำถาม
คุณต้องเขียน unit test จำนวนกี่ test case ?
คำตอบ
น่าจะมากกว่า 1,000 test case สำหรับกรณีทั่วไป แล้วกรณีอื่นๆ ล่ะ … !!
ดังนั้นจะเขียน unit test ไปทั้งหมดคงไม่เหมาะสมนะครับ
หรือถ้าคุณคิดว่า การลงทุนเขียน unit test เป็นพันๆ test case แล้วคุ้ม ก็ทำไปนะครับ
แต่ผมไม่ทำแน่นอน !!
คำถาม
คุณคิดว่า ระบบที่ต้องเขียน test case เป็นพันๆ test case มันเป็นระบบเรียบง่ายไหม ?
คำตอบ
ก็แล้วแต่คุณนะ
ดังนั้น กลับมาดูสิว่า เราควรเขียน unit test จำนวนเท่าไร ?
สิ่งที่เราควรให้ความสนใจคือ state หรือ สถานะของแต่ละ object นั่นเองว่ามีเท่าไร
จากตัวอย่างพบว่าแต่ละ object มี 10 state ดังนั้น
คิดง่ายๆ ก็คือ มี test case รวมทั้งหมด 10 + 10 + 10 = 30
แสดงดังรูป
จากนั้นให้ทำการเขียนหรือทำการทดสอบในระดับที่สูงขึ้น
เพื่อตรวจสอบการ interact กันระหว่าง object
ว่าทำงานได้ถูกต้องตามที่คาดหวัง
และระบบงานยังคงตรงกับความต้องการของลูกค้า
เราไม่จำเป็นต้องเลือกทำอย่างใดอย่างหนึ่งนะครับ
สามารถเลือกระดับการทดสอบได้หลายระดับ
การทดสอบแต่ละระดับล้วนมีความสำคัญและจำเป็นทั้งสิ้น
เพียงแต่มันมีเป้าหมายที่แตกต่างกันเท่านั้นเอง
ตัวอย่างเช่น
- Unit test ใช้เพื่อบอก developer ว่า code นั้นทำงานตามที่ต้องการหรือไม่
- Integration test, BDD, ATDD, System, Performance test นั้นอาจจะไม่ได้ทำการทดสอ[แบบละเอียดมาก แต่มีเป้าหมายเพื่อแสดงให้เห็นว่าระบบงานทำงานตรงตามความต้องการจริงๆ นะ
ข้อคิดสะกิดใจ
ถ้า code ส่วนไหนไม่ถูกใช้งานแล้ว
ก็ไม่มีความจำเป็นที่จะต้องทดสอบ
ดังนั้นเราก็ไม่จำเป็นต้องเขียน code ที่ไม่จำเป็นต่อการใช้งาน
แต่ถ้าเรามักจะทำผิดพลาดขึ้นมาเสมอ
ก็จำเป็นต้องเขียน test ในส่วนนั้นแล้วใช่ไหม ?