Vitest · Test ที่เชื่อถือได้
Test Isolation
เข้าใจ shared state และเหตุผลที่ test แต่ละข้อควรเริ่มจาก state ที่คาดเดาได้
Test แต่ละข้อควรเริ่มจาก state ที่คาดเดาได้
Test isolation หมายถึง test แต่ละข้อไม่ควรพึ่งผลที่ test ก่อนหน้าทิ้งไว้ ถ้า test แรกเพิ่มข้อมูลลง array แล้ว test ที่สองอ่าน array เดิม ผลลัพธ์อาจเปลี่ยนตามลำดับการรันและทำให้ test ผ่านแบบไม่มั่นคง
โค้ดนี้ตั้งใจ fail เพื่อให้เห็นว่าการประกาศ state นอก test อาจทำให้ test พึ่งพากัน
ทดสอบการรั่วของ state ด้วยการจำลองลำดับ
ปัญหา shared state มักมองไม่เห็นเมื่อรัน test เดี่ยว แต่จะเห็นเมื่อ test แรกแก้ค่าทิ้งไว้ให้ test ที่สอง เพื่อเข้าใจ isolation ให้ดูว่าการประกาศ array นอก test ทำให้ผลลัพธ์ของข้อหลังขึ้นกับลำดับอย่างไร
state ที่อยู่ outer scope และถูก mutate อาจทำให้ test ผ่าน/ล้มเหลวตามเพื่อนบ้าน ไม่ใช่ตาม behavior ของตัวเอง
แยก state โดยเริ่มใหม่ทุกกรณี
| รูปแบบ | ความเสี่ยง |
|---|---|
| fixture อยู่ใน test | แต่ละ test สร้างข้อมูลของตัวเอง อ่านง่ายและแยกกัน |
| fixture อยู่ใน outer scope แล้วถูกแก้ | test อื่นอาจเห็นค่าที่เปลี่ยน |
| ใช้ setup ร่วมแต่สร้าง object ใหม่ | ลดซ้ำได้โดยยังรักษา isolation |
กฎสำคัญ
อย่าพึ่งลำดับการรัน
test ต้องผ่านเมื่อรันเดี่ยวหรือรันร่วมกับ test อื่นในไฟล์เดียวกัน
แยก mutable state
ถ้าต้องเปลี่ยน array หรือ object ให้สร้างใหม่ต่อ test หรือ reset อย่างชัดเจน
แบบฝึก: ทำให้ test ไม่พึ่งกัน
ปรับตัวอย่างให้ test สองข้อเริ่มจาก array ใหม่ของตัวเอง
งานที่ต้องทำ
- ย้ายการสร้าง tasks เข้าไปในแต่ละ test หรือ setup ที่สร้างค่าใหม่
- ให้ test แรกเพิ่ม Task ได้
- ให้ test ที่สองตรวจรายการว่างได้โดยไม่ขึ้นกับ test แรก
ลองทำด้วยตัวเองก่อน แล้วค่อยเปิดเฉลยเพื่อเทียบแนวคิดและรายละเอียด