คำถามที่คุณอาจจะถามตัวเอง ซึ่งผมก็เคยถามและตอบตัวเองไปแล้ว ดังนี้

คำถาม
ถ้าเราทำ integration และ system test ไปแล้ว ทำไมจะต้องทำ unit test ด้วยล่ะ ?

คำตอบก็คือ มันเรียบง่ายไงล่ะ …

Screen Shot 2557-11-14 at 10.37.00 PM

มีทางเดียวที่คุณจะรู้ว่าแต่ละบรรทัดของ code ที่คุณเขียนมานั้น

มันทำงานเป็นไปตามความคาดหวังหรือไม่
นั่นก็คือ การเขียน unit test นั่นเอง

ส่วนการทดสอบในระดับที่สูงกว่าก็เพราะว่า
ระบบงานคือการรวมของหลายๆ ส่วนมาทำงานร่วมกัน
ซึ่งไม่สามารถที่จะใช้ unit test ตรวจสอบการทำงานได้
หรือถ้าได้ก็ใช้ความพยายามสูงมากๆ

ดังตัวอย่างเช่น

ถ้าระบบของคุณมีการทำงานดังนี้

Screen Shot 2557-11-14 at 10.05.25 PM

คำถาม
คุณต้องเขียน 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
แสดงดังรูป

Screen Shot 2557-11-14 at 10.12.14 PM

จากนั้นให้ทำการเขียนหรือทำการทดสอบในระดับที่สูงขึ้น
เพื่อตรวจสอบการ interact กันระหว่าง object
ว่าทำงานได้ถูกต้องตามที่คาดหวัง
และระบบงานยังคงตรงกับความต้องการของลูกค้า

เราไม่จำเป็นต้องเลือกทำอย่างใดอย่างหนึ่งนะครับ

สามารถเลือกระดับการทดสอบได้หลายระดับ
การทดสอบแต่ละระดับล้วนมีความสำคัญและจำเป็นทั้งสิ้น
เพียงแต่มันมีเป้าหมายที่แตกต่างกันเท่านั้นเอง

ตัวอย่างเช่น

  • Unit test ใช้เพื่อบอก developer ว่า code นั้นทำงานตามที่ต้องการหรือไม่
  • Integration test, BDD, ATDD, System, Performance test นั้นอาจจะไม่ได้ทำการทดสอ[แบบละเอียดมาก แต่มีเป้าหมายเพื่อแสดงให้เห็นว่าระบบงานทำงานตรงตามความต้องการจริงๆ นะ

ข้อคิดสะกิดใจ

ถ้า code ส่วนไหนไม่ถูกใช้งานแล้ว
ก็ไม่มีความจำเป็นที่จะต้องทดสอบ
ดังนั้นเราก็ไม่จำเป็นต้องเขียน code ที่ไม่จำเป็นต่อการใช้งาน

แต่ถ้าเรามักจะทำผิดพลาดขึ้นมาเสมอ
ก็จำเป็นต้องเขียน test ในส่วนนั้นแล้วใช่ไหม ?