PubTrivia เผยชุดทดสอบ Next.js ไร้ DOM รัน 266 เทสต์ใน 603 มิลลิวินาที
เจาะเบื้องหลังระบบทดสอบของโปรเจกต์ PubTrivia ที่รัน 266 เทสต์เสร็จใน 603 มิลลิวินาทีโดยไม่ต้องพึ่ง DOM, jsdom หรือ Testing Library

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- PubTrivia รัน 266 เทสต์เสร็จสิ้นในเวลาเพียง 603 มิลลิวินาทีโดยไม่มีการใช้ DOM
- ชุดทดสอบประกอบด้วยไฟล์ทั้งหมด 16 ไฟล์ และโค้ดรวมกัน 3,201 บรรทัด
- มีไฟล์เพียง 1 ไฟล์ที่เชื่อมต่อกับฐานข้อมูลและมีขนาดใหญ่ที่สุดคือ 543 บรรทัด
- ระบบไม่มีการตั้งค่าเครื่องมือวัดความครอบคลุมของโค้ด (Coverage) และไม่ได้รัน linter
แอปพลิเคชัน Next.js ที่ชื่อว่า PubTrivia ซึ่งประกอบด้วยไฟล์ .tsx จำนวน 201 ไฟล์ และ 52 ไฟล์ในนั้นเป็น client components ได้เผยแพร่แนวทางการเขียนชุดทดสอบ (Test suite) ที่แหวกแนว โดยไม่มีการใช้งาน browser-like environment ใดๆ ทั้งสิ้น ไม่ว่าจะเป็น jsdom, happy-dom หรือ Testing Library ซึ่งสามารถตรวจสอบได้จากไฟล์ package.json ว่าไม่มีการติดตั้งไลบรารีเหล่านี้เลย
การตั้งค่าระบบทดสอบมีความยาวเพียง 11 บรรทัดเท่านั้น และจากผลลัพธ์ของ vitest list พบว่าชุดทดสอบประกอบด้วย 266 เทสต์ จาก 16 ไฟล์ รวม 3,201 บรรทัด โดยมีเพียง 13 เทสต์ที่ต้องใช้ฐานข้อมูล ส่วนที่เหลืออีก 253 เทสต์ไม่ต้องพึ่งพาข้อมูลใดๆ ทั้งสิ้น ผลลัพธ์การรันระบุว่า Test Files ผ่านทั้งหมด 15 ไฟล์ และ Tests ผ่าน 253 เทสต์ ใช้เวลาดำเนินการเพียง 603 มิลลิวินาที

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
ในบรรดาไฟล์ทั้งหมด มี 4 ไฟล์ที่เรียกใช้งาน vi.mock ขณะที่อีก 12 ไฟล์ไม่มีการจำลองข้อมูลใดๆ เนื่องจากไม่มีความจำเป็นต้องจำลอง โดยทำการอิมพอร์ตโมดูลมาเรียกใช้โดยตรง ไฟล์ที่น่าสนใจคือ pricing/price-copy.test.ts ซึ่งทดสอบ React component จริงโดยอาศัย server renderer เนื่องจากไม่มี DOM
"The limits are real. Nothing here can click. No test in this repository has ever fired an event, checked a focus ring, or asserted that a dialog closes."
Daniel Pertu
ข้อจำกัดเหล่านี้เกิดขึ้นโดยเจตนา เนื่องจากไม่มีเทสต์ใดในrepository ที่เคยจำลองการคลิก ตรวจสอบ focus ring หรือยืนยันว่า dialog ปิดลงหรือไม่ สำหรับระบบที่ต้องปกป้องข้อมูลทางการเงินและ metadata ถือเป็นการตัดสินใจแลกเปลี่ยนที่ยอมรับได้ แต่ควรตระหนักถึงข้อจำกัดเหล่านี้ตั้งแต่วันนี้แทนที่จะไปพบปัญหาภายหลัง
แนวทางการทดสอบแบบไร้ DOM (DOM-less testing) ในโปรเจกต์ Next.js สะท้อนให้เห็นว่านักพัฒนาสามารถเลือกละทิ้งเครื่องมือจำลองเบราว์เซอร์ที่มักทำให้การรันเทสต์ช้าลง เพื่อแลกมากับความเร็วระดับมิลลิวินาที อย่างไรก็ตาม แนวทางนี้แลกมาด้วยข้อจำกัดที่ไม่สามารถทดสอบพฤติกรรมฝั่ง UI หรือการโต้ตอบของผู้ใช้งานจริงๆ ได้ ซึ่งเหมาะสำหรับโปรเจกต์ที่เน้นความถูกต้องของตรรกะข้อมูลหลังบ้านมากกว่าความซับซ้อนของการแสดงผลบนหน้าจอ
นอกจากนี้ ยังมีไฟล์ที่ใช้วิธีการอ่านซอร์สโค้ดด้วย Regular Expression แทนการอิมพอร์ตตรงๆ เช่น ไฟล์ทดสอบ page metadata ที่ดึงค่า export const metadata จากไฟล์หน้าเว็บนับร้อย เพื่อหลีกเลี่ยงการบูตระบบ Supabase รวมถึงไฟล์ shared-constants.test.ts ที่ใช้วิธีพาร์สซอร์สโค้ดของแพ็กเกจอื่นเนื่องจาก WebSocket server แยก build root ออกไป
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น