Vitest · เริ่มต้นกับ Vitest
ไฟล์ `.test.ts`
เข้าใจกติกาการตั้งชื่อไฟล์และการค้นหา test file ของ Vitest
Vitest รู้ได้อย่างไรว่าไฟล์ไหนคือ test
โดยค่าเริ่มต้น Vitest ใช้ชื่อไฟล์เป็นสัญญาณในการค้นหา test file ไฟล์ที่มี `.test.` หรือ `.spec.` อยู่ในชื่อจะอยู่ในรูปแบบที่ runner คาดว่าจะเป็นไฟล์ทดสอบ เช่น `task-service.test.ts` และ `task-service.spec.ts`
จุดสำคัญคือมีจุดคั่นก่อน `test` หรือ `spec` ไม่ใช่แค่เติมตัวอักษรต่อท้ายชื่อไฟล์
การถูกค้นพบหมายถึง runner มองเห็นไฟล์นั้นในขั้นตอน scan เท่านั้น ยังไม่ได้แปลว่าเนื้อหาในไฟล์ถูกต้องหรือ test ผ่าน
แยกส่วนประกอบของชื่อไฟล์
ส่วนซ้ายช่วยบอกว่า test เกี่ยวกับ source ใด ส่วนกลางบอก runner ว่าไฟล์นี้เป็น test และส่วนขวาบอกภาษาไฟล์
| ไฟล์ | บทบาท | Vitest จะค้นพบแบบ default หรือไม่ |
|---|---|---|
| task-service.ts | source code | ไม่ใช่ test file |
| task-service.test.ts | test file | ใช่ |
| task-service.spec.ts | test file | ใช่ |
| task-service.tests.ts | ไฟล์ที่ชื่อใกล้เคียง | ไม่ควรคาดหวังว่าจะพบ |
วาง test file ข้าง source หรือแยกโฟลเดอร์
Vitest ไม่ได้บังคับว่าต้องวาง test ไว้ตำแหน่งเดียวเสมอไป สิ่งที่ต้องรักษาคือชื่อไฟล์ต้องตรง pattern และทีมต้องใช้ convention เดียวกัน ตัวอย่างสองรูปแบบที่พบบ่อยคือวางไฟล์ไว้ข้าง source หรือรวมไว้ในโฟลเดอร์ `__tests__`
| รูปแบบ | ข้อดี | ข้อควรคิด |
|---|---|---|
| co-located | เห็น source กับ test เป็นคู่และ import สั้น | โฟลเดอร์ source มีไฟล์เพิ่มขึ้น |
| แยก `__tests__` | รวม test เป็นกลุ่มและค้นหาเป็นชุดง่าย | ต้องเดิน path เพื่อดู source ที่ถูกทดสอบ |
ทั้งสองแบบใช้ได้ในเชิง discovery หากชื่อไฟล์และขอบเขตการค้นหาของโปรเจกต์ยังรองรับ
อย่าแก้ชื่อไฟล์ใกล้เคียงแบบเดาสุ่ม
ถ้า runner หาไฟล์ไม่เจอ ให้ตรวจจุดก่อน `test` หรือ `spec` ก่อน แล้วค่อยพิจารณาการตั้งค่าเพิ่มเติมในบทที่เกี่ยวข้อง
สรุปกติกา file discovery
กฎสำคัญ
`.test.` และ `.spec.` คือ pattern หลัก
ไฟล์ต้องมีจุดคั่นตามรูปแบบ เช่น `task-service.test.ts` ไม่ใช่ `task-service.tests.ts`
ตำแหน่งเลือกตาม convention
วางข้าง source หรือใน `__tests__` ได้ ตราบใดที่ชื่อและกติกาของทีมสอดคล้องกัน
ค้นพบไม่เท่ากับผ่าน
การ scan เจอไฟล์เป็นเพียงขั้นแรก เนื้อหาข้างในยังต้องถูกโหลดและรันได้จริง
เมื่อพร้อมแล้ว บทถัดไปจะใช้คำสั่ง `vitest run` เพื่อรัน test ทั้งชุดหนึ่งครั้ง