CupCode.cc
Section 03 · Module 03 · Lesson 02 · ~20–24 นาที

การสมดุลระดับการทดสอบ

หลังเข้าใจ Test Pyramid แล้ว คำถามที่สำคัญกว่าคือ 'เคสนี้ควรไปอยู่ระดับไหน' บทนี้จะช่วยให้คุณเลือกได้เป็นระบบขึ้น ว่าเมื่อไรควรใช้ unit, integration, contract หรือ E2E เพื่อให้ได้ความมั่นใจพอดีกับต้นทุน

เวลาเรียน: 20–24 นาที ต้องรู้มาก่อน: Lesson 05 - Test Pyramid ของ Mike Cohn รูปแบบ: อ่าน + decision guide + แบบฝึกเลือก test level

จบบทนี้แล้วคุณจะ...

  • เลือกระดับการทดสอบที่เหมาะกับ scenario ต่าง ๆ ได้มีเหตุผลขึ้น
  • เข้าใจข้อจำกัดของ unit test และเหตุผลที่ integration test สำคัญมาก
  • แยกบทบาทของ integration, contract และ E2E ได้ชัดขึ้น
  • ใช้หลัก “เลือกระดับต่ำสุดที่พิสูจน์สิ่งนั้นได้” ได้จริง
  • ลดการทุ่มทุกอย่างไปไว้ที่ E2E โดยไม่จำเป็น
1 · หลักคิดสำคัญที่สุด

เลือกระดับที่ต่ำที่สุดที่ยังพิสูจน์ความเสี่ยงนั้นได้

เวลาเจอ requirement หรือ test idea ใหม่ อย่าเริ่มจากคำถามว่า:

  • “เขียน E2E ได้ไหม”

ให้เริ่มจาก:

  • “เรากำลังพยายามพิสูจน์อะไร”
  • “ปัญหานี้จับได้ในระดับที่ถูกกว่านี้ไหม”

ตัวอย่าง:

  • ถ้ากำลังพิสูจน์สูตรคำนวณส่วนลด ใช้ unit test ก็พอ
  • ถ้ากำลังพิสูจน์ว่า API คุยกับ database ถูก ใช้ integration test เหมาะกว่า
  • ถ้ากำลังพิสูจน์ว่า user ซื้อของจบจริง ใช้ E2E จึงจะครบ

หลักนี้ช่วยให้เราไม่ใช้ค้อนใหญ่กับทุกปัญหา

2 · ข้อจำกัดของ Unit Test

มันเก่งมากกับ logic รายส่วน แต่ไม่เก่งกับโลกจริงที่เชื่อมกันหลายจุด

unit test เหมาะมากเมื่อ:

  • มี input/output ชัด
  • dependency น้อย
  • อยาก feedback เร็ว

แต่สิ่งที่มันมองไม่เห็นคือ:

  • การ map data ผิด format ระหว่างชั้น
  • config ผิด
  • query จริงไม่ตรงกับที่ mock ไว้
  • integration กับ third-party ที่มี behavior ต่างจาก stub

ดังนั้น unit เยอะไม่แปลว่าระบบทั้งก้อนปลอดภัยแล้ว

3 · Integration Test คือ sweet spot ของหลายทีม

เพราะมันแพงกว่า 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 ในจุดที่สำคัญ

4 · เมื่อไร E2E ถึงจำเป็นจริง

ใช้กับสิ่งที่ต้องพิสูจน์จากมุมผู้ใช้หรือข้ามหลายชั้นพร้อมกัน

E2E ควรถูกใช้กับ:

  • login / registration
  • checkout / payment
  • order placement
  • reset password
  • flow ที่รายได้หรือความเชื่อมั่นของผู้ใช้ขึ้นอยู่กับมัน

นอกจากนี้ E2E ยังเหมาะเมื่อ:

  • ต้องเช็ก behavior บน browser จริง
  • มีหลายหน้าหรือหลาย service ต่อกัน
  • มี state เปลี่ยนไปตลอด flow

แต่ไม่ควรใช้ E2E ไปตรวจ logic ย่อย ๆ ที่ unit หรือ integration จับได้ถูกกว่าและเร็วกว่า

5 · Contract Testing อยู่ตรงไหนในภาพนี้

มันไม่แทน integration หรือ E2E ทั้งหมด แต่ช่วยปิดช่องว่างบางจุดได้ดีมาก

contract test เน้นเช็กว่า “ผู้ให้บริการ” และ “ผู้เรียกใช้” ยังเข้าใจรูปแบบข้อมูลตรงกันอยู่ไหม

เหมาะกับ:

  • microservices
  • frontend-backend ที่พึ่ง schema ชัด
  • integration กับ third-party ที่มี contract แน่นอน

ข้อดี:

  • เร็วกว่า E2E
  • ชี้ปัญหาที่ interface ได้ไว
  • ไม่ต้องยก environment ใหญ่ขึ้นมาทุกครั้ง

ข้อจำกัด:

  • ไม่ได้พิสูจน์ user flow เต็ม
  • ไม่ได้แทนการทดสอบ business flow จากต้นจนจบ
6 · ตัวอย่างการเลือก test level

ลองถามว่าเราอยากลดความเสี่ยงแบบไหน

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 ต้องเช็กการเชื่อมต่อและรูปแบบข้อมูล
7 · วิธีตัดสินใจแบบเร็วในชีวิตจริง

ใช้คำถาม 4 ข้อนี้ช่วยกรอง

  1. สิ่งที่เราจะพิสูจน์เป็น logic รายส่วน หรือเป็นการเชื่อมกันหลายชั้น
  2. ถ้า fail เราอยากรู้ปัญหาเร็วแค่ไหน
  3. จำเป็นต้องใช้ browser จริงหรือ UI จริงหรือไม่
  4. ถ้าใช้ระดับแพงกว่า เราได้ความมั่นใจเพิ่มจริงไหม

ถ้าคำตอบข้อ 4 คือ “ไม่มาก” ให้ถอยลงมาระดับที่ถูกกว่า

Practice

แบบฝึก: เลือกระดับการทดสอบให้เหมาะ

  1. ฟังก์ชันคำนวณค่าจัดส่งตามน้ำหนักและจังหวัดควรอยู่ระดับไหน

    ดูคำตอบแนะนำ

    ส่วนใหญ่ควรเริ่มที่ unit test เพราะเป็นกฎการคำนวณที่มี input/output ชัด และต้องเช็กหลาย edge cases ได้เร็ว

  2. endpoint /orders บันทึกข้อมูลลง database แล้วคืน order number ควรใช้ระดับไหน

    ดูคำตอบแนะนำ

    integration test เหมาะที่สุด เพราะต้องพิสูจน์ว่า API, validation, persistence และ response ทำงานร่วมกันถูกต้อง

  3. flow ซื้อของครบตั้งแต่เพิ่มสินค้า ใส่ที่อยู่ จ่ายเงิน และเห็นหน้าสำเร็จ ควรใช้ระดับไหน

    ดูคำตอบแนะนำ

    E2E เหมาะที่สุด เพราะเป็น critical user flow ที่ต้องพิสูจน์การทำงานต่อเนื่องหลายขั้นจากมุมผู้ใช้จริง

  4. ระบบส่งข้อมูลไป email service ภายนอก แต่ไม่จำเป็นต้องเปิด UI ทั้ง flow ควรคิดอย่างไร

    ดูคำตอบแนะนำ

    มักเหมาะกับ integration หรือ contract test มากกว่า E2E เพราะสิ่งที่ต้องพิสูจน์คือรูปแบบ request/response และการเชื่อมต่อ ไม่ใช่พฤติกรรม UI ทั้งเส้น

สิ่งที่ต้องเอาติดตัวไปจากบทนี้

  • เริ่มจากคำถามว่าเรากำลังพิสูจน์ความเสี่ยงอะไร ไม่ใช่เริ่มจากเครื่องมือที่อยากใช้
  • unit test เร็วและถูก แต่มีขอบเขตจำกัด
  • integration test มักเป็น sweet spot สำหรับปัญหาที่เกิดตรงจุดเชื่อมต่อ
  • E2E จำเป็นสำหรับ critical user flows และสิ่งที่ต้องพิสูจน์จากมุมผู้ใช้จริง
  • หลักที่ใช้ได้เสมอคือเลือกระดับต่ำสุดที่ยังให้ความมั่นใจพอ