Integration Tests
Integration test คือการตรวจว่าหลายส่วนของระบบทำงานร่วมกันได้จริง เช่น UI ต่อกับ state, service ต่อกับ repository หรือ module หลายก้อนส่งข้อมูลกันถูกต้อง
จุดเด่นของ integration test
มันไม่ละเอียดเล็กเท่า unit test แต่ช่วยพิสูจน์ความถูกต้องของรอยต่อระหว่างส่วนต่าง ๆ ได้ดีกว่า
มันคืออะไร
Integration test มองระบบกว้างขึ้นกว่าหน่วยเดียว โดยสนใจว่าหลายส่วนที่ต้องทำงานร่วมกันนั้นต่อกันถูกหรือไม่ เช่น component เรียก hook แล้วแสดงผลได้, service คุยกับ data layer แล้วคืนค่าตามที่ต้องการ
พิสูจน์อะไรได้ / พิสูจน์อะไรไม่ได้
เมื่อปัญหาไม่ได้อยู่ที่ logic ก้อนเดียวแต่อยู่ที่การเชื่อมกันของหลายชั้น Integration test จะมีประโยชน์มากกว่า unit test แต่ก็ยังไม่เท่ากับการจำลองผู้ใช้จริงเต็มรูปแบบ
Point 1
พิสูจน์ได้: contract ระหว่าง module, state, service และ data flow
Point 2
พิสูจน์ได้: flow สำคัญที่พังเพราะหลายส่วนต่อกันผิด
Point 3
พิสูจน์ไม่ได้ทั้งหมด: ประสบการณ์ผู้ใช้จริงทั้ง journey หรือสภาพแวดล้อม production ครบทุกจุด
เหมาะใช้เมื่อไร
Integration test เหมาะกับ flow ที่ถ้าแยก test ทีละส่วนแล้วดูเหมือนผ่าน แต่พอมาต่อกันจริงมักพัง เช่น form submit, state update, หรือการแปลงข้อมูลข้าม layer
- ใช้กับ flow ที่มีหลาย module ทำงานร่วมกัน
- ใช้เมื่อต้องพิสูจน์รอยต่อ ไม่ใช่แค่ผลลัพธ์ของ function เดียว
- เลือกเฉพาะกรณีสำคัญเพื่อลดความช้าและความซับซ้อนในการ debug
- ถ้ามีมากเกินจำเป็น test suite จะเริ่มช้าและดูแลยาก
Practice
ลองออกแบบ test case
อ่าน flow นี้แล้วลองคิดว่า integration test ควรพิสูจน์อะไรบ้าง
โจทย์
มีฟอร์มสมัครสมาชิก เมื่อผู้ใช้กรอกชื่อ อีเมล และรหัสผ่าน แล้วกด submit ระบบจะ validate ข้อมูล เรียก API และแสดงข้อความสมัครสำเร็จ
ลองคิดก่อน
- ควร test การทำงานร่วมกันของส่วนไหนบ้าง
- จุดไหนคือรอยต่อสำคัญที่มักพัง
- มีกรณี fail แบบไหนที่ควรครอบคลุม
ดูแนวคิดเฉลย
- ควร test ว่า form state, validation, API call และ UI result ทำงานต่อกันถูก
- ควร test ว่าถ้ากรอกข้อมูลไม่ครบ ระบบไม่เรียก API และแสดง error ถูกจุด
- ควร test ว่าถ้า API สำเร็จ UI แสดง success message ได้
- ควร test ว่าถ้า API ล้มเหลว ระบบแสดงข้อความ error ที่เหมาะสม