การสมดุลระดับการทดสอบ
หลังเข้าใจ Test Pyramid แล้ว คำถามที่สำคัญกว่าคือ 'เคสนี้ควรไปอยู่ระดับไหน' บทนี้จะช่วยให้คุณเลือกได้เป็นระบบขึ้น ว่าเมื่อไรควรใช้ unit, integration, contract หรือ E2E เพื่อให้ได้ความมั่นใจพอดีกับต้นทุน
จบบทนี้แล้วคุณจะ...
- เลือกระดับการทดสอบที่เหมาะกับ scenario ต่าง ๆ ได้มีเหตุผลขึ้น
- เข้าใจข้อจำกัดของ unit test และเหตุผลที่ integration test สำคัญมาก
- แยกบทบาทของ integration, contract และ E2E ได้ชัดขึ้น
- ใช้หลัก “เลือกระดับต่ำสุดที่พิสูจน์สิ่งนั้นได้” ได้จริง
- ลดการทุ่มทุกอย่างไปไว้ที่ E2E โดยไม่จำเป็น
เลือกระดับที่ต่ำที่สุดที่ยังพิสูจน์ความเสี่ยงนั้นได้
เวลาเจอ requirement หรือ test idea ใหม่ อย่าเริ่มจากคำถามว่า:
- “เขียน E2E ได้ไหม”
ให้เริ่มจาก:
- “เรากำลังพยายามพิสูจน์อะไร”
- “ปัญหานี้จับได้ในระดับที่ถูกกว่านี้ไหม”
ตัวอย่าง:
- ถ้ากำลังพิสูจน์สูตรคำนวณส่วนลด ใช้ unit test ก็พอ
- ถ้ากำลังพิสูจน์ว่า API คุยกับ database ถูก ใช้ integration test เหมาะกว่า
- ถ้ากำลังพิสูจน์ว่า user ซื้อของจบจริง ใช้ E2E จึงจะครบ
หลักนี้ช่วยให้เราไม่ใช้ค้อนใหญ่กับทุกปัญหา
มันเก่งมากกับ logic รายส่วน แต่ไม่เก่งกับโลกจริงที่เชื่อมกันหลายจุด
unit test เหมาะมากเมื่อ:
- มี input/output ชัด
- dependency น้อย
- อยาก feedback เร็ว
แต่สิ่งที่มันมองไม่เห็นคือ:
- การ map data ผิด format ระหว่างชั้น
- config ผิด
- query จริงไม่ตรงกับที่ mock ไว้
- integration กับ third-party ที่มี behavior ต่างจาก stub
ดังนั้น unit เยอะไม่แปลว่าระบบทั้งก้อนปลอดภัยแล้ว
เพราะมันแพงกว่า unit ไม่มาก แต่จับปัญหาที่เจอบ่อยในงานจริงได้เยอะ
integration test เหมาะกับสถานการณ์แบบนี้:
- API เรียกฐานข้อมูลแล้วคืนค่า JSON
- service หนึ่ง publish event แล้วอีก service รับไปทำงานต่อ
- frontend เรียก backend แล้วต้อง parse response ให้ถูก
- ระบบส่ง request ไป payment/email provider
สิ่งที่ integration test มักจับได้ดี:
- schema mismatch
- transaction ไม่ครบ
- query ผิด
- error handling ไม่ตรง
- configuration ผิด
หลายทีมลด production bugs ได้เยอะไม่ใช่เพราะเพิ่ม E2E แต่เพราะเพิ่ม integration ในจุดที่สำคัญ
ใช้กับสิ่งที่ต้องพิสูจน์จากมุมผู้ใช้หรือข้ามหลายชั้นพร้อมกัน
E2E ควรถูกใช้กับ:
- login / registration
- checkout / payment
- order placement
- reset password
- flow ที่รายได้หรือความเชื่อมั่นของผู้ใช้ขึ้นอยู่กับมัน
นอกจากนี้ E2E ยังเหมาะเมื่อ:
- ต้องเช็ก behavior บน browser จริง
- มีหลายหน้าหรือหลาย service ต่อกัน
- มี state เปลี่ยนไปตลอด flow
แต่ไม่ควรใช้ E2E ไปตรวจ logic ย่อย ๆ ที่ unit หรือ integration จับได้ถูกกว่าและเร็วกว่า
มันไม่แทน integration หรือ E2E ทั้งหมด แต่ช่วยปิดช่องว่างบางจุดได้ดีมาก
contract test เน้นเช็กว่า “ผู้ให้บริการ” และ “ผู้เรียกใช้” ยังเข้าใจรูปแบบข้อมูลตรงกันอยู่ไหม
เหมาะกับ:
- microservices
- frontend-backend ที่พึ่ง schema ชัด
- integration กับ third-party ที่มี contract แน่นอน
ข้อดี:
- เร็วกว่า E2E
- ชี้ปัญหาที่ interface ได้ไว
- ไม่ต้องยก environment ใหญ่ขึ้นมาทุกครั้ง
ข้อจำกัด:
- ไม่ได้พิสูจน์ user flow เต็ม
- ไม่ได้แทนการทดสอบ business flow จากต้นจนจบ
ลองถามว่าเราอยากลดความเสี่ยงแบบไหน
| Scenario | ระดับที่เหมาะ | เหตุผล |
|---|---|---|
| คำนวณค่าส่วนลดจาก coupon | Unit | เป็น business rule ล้วน ๆ |
GET /customers/:id ดึงข้อมูลจาก DB |
Integration | ต้องพิสูจน์ API + DB ทำงานร่วมกัน |
| สมัครสมาชิกจนเห็น welcome screen | E2E | เป็น flow ผู้ใช้จริงหลายขั้นตอน |
| validate รูปแบบ email | Unit | logic แยกส่วน ชัดเจน |
| ระบบส่ง order payload ไป payment provider | Integration + Contract | ต้องเช็กการเชื่อมต่อและรูปแบบข้อมูล |
ใช้คำถาม 4 ข้อนี้ช่วยกรอง
- สิ่งที่เราจะพิสูจน์เป็น logic รายส่วน หรือเป็นการเชื่อมกันหลายชั้น
- ถ้า fail เราอยากรู้ปัญหาเร็วแค่ไหน
- จำเป็นต้องใช้ browser จริงหรือ UI จริงหรือไม่
- ถ้าใช้ระดับแพงกว่า เราได้ความมั่นใจเพิ่มจริงไหม
ถ้าคำตอบข้อ 4 คือ “ไม่มาก” ให้ถอยลงมาระดับที่ถูกกว่า
แบบฝึก: เลือกระดับการทดสอบให้เหมาะ
ฟังก์ชันคำนวณค่าจัดส่งตามน้ำหนักและจังหวัดควรอยู่ระดับไหน
ดูคำตอบแนะนำ
ส่วนใหญ่ควรเริ่มที่ unit test เพราะเป็นกฎการคำนวณที่มี input/output ชัด และต้องเช็กหลาย edge cases ได้เร็ว
endpoint
/ordersบันทึกข้อมูลลง database แล้วคืน order number ควรใช้ระดับไหนดูคำตอบแนะนำ
integration test เหมาะที่สุด เพราะต้องพิสูจน์ว่า API, validation, persistence และ response ทำงานร่วมกันถูกต้อง
flow ซื้อของครบตั้งแต่เพิ่มสินค้า ใส่ที่อยู่ จ่ายเงิน และเห็นหน้าสำเร็จ ควรใช้ระดับไหน
ดูคำตอบแนะนำ
E2E เหมาะที่สุด เพราะเป็น critical user flow ที่ต้องพิสูจน์การทำงานต่อเนื่องหลายขั้นจากมุมผู้ใช้จริง
ระบบส่งข้อมูลไป email service ภายนอก แต่ไม่จำเป็นต้องเปิด UI ทั้ง flow ควรคิดอย่างไร
ดูคำตอบแนะนำ
มักเหมาะกับ integration หรือ contract test มากกว่า E2E เพราะสิ่งที่ต้องพิสูจน์คือรูปแบบ request/response และการเชื่อมต่อ ไม่ใช่พฤติกรรม UI ทั้งเส้น
สิ่งที่ต้องเอาติดตัวไปจากบทนี้
- เริ่มจากคำถามว่าเรากำลังพิสูจน์ความเสี่ยงอะไร ไม่ใช่เริ่มจากเครื่องมือที่อยากใช้
- unit test เร็วและถูก แต่มีขอบเขตจำกัด
- integration test มักเป็น sweet spot สำหรับปัญหาที่เกิดตรงจุดเชื่อมต่อ
- E2E จำเป็นสำหรับ critical user flows และสิ่งที่ต้องพิสูจน์จากมุมผู้ใช้จริง
- หลักที่ใช้ได้เสมอคือเลือกระดับต่ำสุดที่ยังให้ความมั่นใจพอ