Vitest · เริ่มคิดแบบ Test
Unit Test คืออะไร
เรียนรู้ขอบเขตของ unit test ที่โฟกัส function หรือ logic ก้อนเล็ก ๆ
Unit คืออะไร
Unit test คือการทดสอบหน่วยเล็กของโปรแกรม โดยมักโฟกัส function หรือ logic ก้อนหนึ่งที่เราควบคุม input ได้ชัดเจน เป้าหมายคือรู้ว่า logic นี้ทำงานถูกต้องในหลายสถานการณ์ โดยไม่ต้องเปิดทั้งแอปหรือเชื่อมต่อระบบภายนอก
ตัวอย่างเช่น `completeTask` ควรถูกทดสอบแยกจากฐานข้อมูลและ UI เพราะคำถามของเราคือ logic การเปลี่ยนสถานะ Task ไม่ใช่การทดสอบว่าปุ่มบนหน้าเว็บส่ง request ได้หรือไม่
ลองแยกหนึ่งหน่วยออกจากทั้งระบบ
สมมติว่าแอปมีหน้าเว็บ ปุ่ม และฐานข้อมูล แต่คำถามของเราคือ “เมื่อส่ง Task เข้า completeTask สถานะเปลี่ยนเป็นเสร็จหรือไม่” เราสามารถตัดส่วนอื่นออก แล้วเรียก function โดยตรงได้ นี่คือเหตุผลที่ unit test มักเร็วและอ่านง่ายกว่า test ที่เปิดทั้งแอป
เมื่อเปลี่ยนจากการพิมพ์ console.log มาเป็น Vitest ในบทถัดไป เราจะเก็บ input และการเรียก function แบบเดิมไว้ แล้วเปลี่ยนส่วนที่คอยมองผลด้วยตาให้เป็น assertion ที่เครื่องตรวจซ้ำได้
แยกขอบเขตการทดสอบ
| ชนิด | ขอบเขต | ตัวอย่าง |
|---|---|---|
| Unit test | function หรือ logic ก้อนเล็ก | `completeTask(task)` คืน Task ที่เสร็จแล้ว |
| Integration test | หลายส่วนทำงานร่วมกัน | service เรียก repository แล้วแปลงข้อมูลได้ถูกต้อง |
| E2E test | flow ตั้งแต่ต้นจนจบเหมือนผู้ใช้ | เปิดหน้า Task กดปุ่ม แล้วเห็นสถานะใหม่ |
Unit ไม่ได้แปลว่าต้องไม่มี object
คำว่า unit หมายถึงขอบเขตของคำถาม ไม่ได้บังคับว่าฟังก์ชันต้องมีเพียงหนึ่งบรรทัดหรือห้ามใช้ object ภายใน
แบบฝึก: จำแนกขอบเขต
อ่านสถานการณ์แล้วบอกว่าเป็น unit, integration หรือ E2E พร้อมเหตุผลสั้น ๆ
งานที่ต้องทำ
- ตรวจ `findTask(tasks, 2)` คืน Task ที่ id เป็น 2
- ตรวจ service โหลดข้อมูลจาก repository แล้วส่งเฉพาะ Task ที่ยังไม่เสร็จ
- ตรวจผู้ใช้เปิดหน้าเว็บ กด Complete และเห็นป้าย Completed
ลองทำด้วยตัวเองก่อน แล้วค่อยเปิดเฉลยเพื่อเทียบแนวคิดและรายละเอียด