Unit Tests
Unit test คือการทดสอบหน่วยเล็กที่มีขอบเขตชัด เช่น function หรือ business logic ก้อนเล็ก ๆ เพื่อให้รู้เร็วที่สุดเมื่อพฤติกรรมระดับพื้นฐานผิดไปจากที่คาด
คิดง่าย ๆ
ถ้าอยากเช็กว่า logic ชิ้นเล็กทำงานถูกไหมโดยไม่ลากทั้งระบบมาด้วย นั่นคือพื้นที่ของ unit test
มันคืออะไร
Unit test โฟกัสที่ขอบเขตเล็กและชัดเจนที่สุดของระบบ เช่น function, method หรือ pure logic หนึ่งก้อน เป้าหมายคือแยกคำถามให้ง่ายที่สุดว่า logic นี้ถูกหรือไม่
พิสูจน์อะไรได้ / พิสูจน์อะไรไม่ได้
Unit test ให้ feedback เร็วมากและเหมาะกับการไล่ edge case แต่ไม่ได้แปลว่าจะยืนยันได้ว่าหลายส่วนของระบบต่อกันถูกต้องแล้ว
Point 1
พิสูจน์ได้: business logic, edge cases, utility behavior
Point 2
พิสูจน์ได้: การคำนวณหรือ branching เล็ก ๆ ที่ควรตอบแน่นอน
Point 3
พิสูจน์ไม่ได้: integration ระหว่างหลาย module หรือ flow ผู้ใช้ทั้งระบบ
เหมาะใช้เมื่อไร
ให้เริ่มจากจุดที่ logic สำคัญแต่ขอบเขตเล็ก เช่น การคำนวณราคา การ validate ข้อมูล หรือ function ที่มีหลายเงื่อนไข เพราะ unit test จะช่วยจับความผิดพลาดได้เร็วที่สุด
- ใช้กับ business logic ที่มีเงื่อนไขเยอะ
- ใช้กับ edge cases ที่คนมักลืมทดสอบมือ
- ใช้กับ utility หรือ mapper ที่ควรให้ผลลัพธ์แน่นอน
- อย่าคาดหวังให้ unit test แบกความมั่นใจเรื่องการต่อกันทั้งระบบ
Practice
ลองออกแบบ test case
อ่านโจทย์ด้านล่าง แล้วลองคิดว่าถ้าเป็น unit test คุณควร test อะไรบ้าง
โจทย์
มีฟังก์ชัน calculateDiscountedPrice(price, discountPercent) ที่รับราคาสินค้าและเปอร์เซ็นต์ส่วนลด แล้วคืนราคาสุทธิ
ลองคิดก่อน
- ควรมี test case ปกติอะไรบ้าง
- มี edge case อะไรที่ควรครอบคลุม
- มี input แบบไหนที่ควร validate หรือ reject
ดูแนวคิดเฉลย
- ควร test กรณีทั่วไป เช่น ราคา 1000 ลด 10% แล้วต้องได้ 900
- ควร test edge case เช่น ส่วนลด 0%, 100%, ราคา 0
- ควร test input ผิดปกติ เช่น ราคาติดลบ, discount ติดลบ, discount เกิน 100
- ถ้าฟังก์ชันมีการปัดเศษ ควร test เรื่องทศนิยมให้ชัด