ในฐานะ Senior Architect การทำความเข้าใจว่า Test Framework ทำงานอย่างไรเป็นสิ่งสำคัญอย่างยิ่ง โดยเฉพาะอย่างยิ่งเมื่อต้องจัดการกับ Test Suite ขนาดใหญ่ Playwright มีกลไกที่ชัดเจนในการกำหนดลำดับการรัน Test (Test Execution Order) ซึ่งไม่ได้ขึ้นอยู่กับว่าคุณเขียนไฟล์นั้นก่อนหรือหลัง แต่ขึ้นอยู่กับโครงสร้างชื่อไฟล์และโฟลเดอร์เป็นหลัก บทความนี้จะเจาะลึกหลักการทำงานเพื่อช่วยให้คุณควบคุมลำดับการรัน Test ได้อย่างแม่นยำ
📂 1. การกำหนดลำดับการรัน Test ด้วยโครงสร้าง Folder และ File
Playwright จะทำงานในรูปแบบของการสแกนหาไฟล์ Test ทั้งหมดในไดเรกทอรีที่กำหนด และจะใช้หลักการจัดเรียงตามลำดับตัวอักษร (Alphabetical Sorting) ทั้งในระดับโฟลเดอร์และระดับไฟล์
- ชื่อ Folder: Playwright จะรัน Test Suite ที่อยู่ในโฟลเดอร์ที่ขึ้นต้นด้วยตัวอักษร (A-Z) หรือตัวเลข (0-9) ก่อน
- ชื่อไฟล์: ภายในโฟลเดอร์เดียวกัน การรัน Test จะเรียงตามชื่อไฟล์ที่เรียงตามลำดับตัวอักษรเช่นกัน
💡 Best Practice: การควบคุมลำดับด้วยตัวเลขนำหน้า
หากคุณต้องการให้ Test Suite บางตัวทำงานตามลำดับขั้นตอนที่กำหนด (เช่น Setup -> Feature A -> Cleanup) คุณควรใช้ตัวเลขนำหน้าชื่อไฟล์ (Numeric Prefixes) เพื่อบังคับลำดับการรัน ซึ่งเป็นเทคนิคที่นักพัฒนาอาวุโสนิยมใช้มากที่สุด
TypeScript
// 01-setup.spec.ts (รันก่อนเสมอ)
TypeScript
// 02-feature-a.spec.ts
TypeScript
// 03-cleanup.spec.ts (รันหลังสุด)
🔢 2. ลำดับการรันภายในไฟล์เดียว (Sequential Execution)
เมื่อคุณเปิดไฟล์ Test เดียว (เช่น login.spec.ts) และเขียนคำสั่ง test(...) ไว้หลาย Block Playwright จะรัน Test เหล่านั้นตามลำดับที่ปรากฏในไฟล์ โดยรันจากบนลงล่าง (Top-to-Bottom) เสมอ
TypeScript
test('Test 1: Login', async ({ page }) => { /* ... */ });
TypeScript
test('Test 2: Logout', async ({ page }) => { /* ... */ });
ลำดับนี้เป็นแบบเชิงเส้น (Sequential) หมายความว่า Test 2 จะไม่เริ่มจนกว่า Test 1 จะเสร็จสมบูรณ์
⚡ 3. ข้อควรระวัง: ผลกระทบจาก Parallelism
นี่คือจุดที่ผู้พัฒนาต้องระมัดระวังที่สุด เมื่อคุณตั้งค่าให้ Playwright ทำงานแบบขนาน (Parallelism) โดยการเพิ่มจำนวน Worker (เช่น npx playwright test --workers=4) Playwright จะพยายามกระจาย Test หลาย ๆ ไฟล์ให้ทำงานพร้อมกันในเวลาเดียวกัน
ผลลัพธ์: ลำดับการรัน Test จะกลายเป็นแบบไม่กำหนด (Non-deterministic) เนื่องจาก Test ต่าง ๆ จะถูกสุ่มกระจายไปทำงานใน Worker หลายตัวพร้อมกัน หาก Test ของคุณมีการพึ่งพาผลลัพธ์ (State Dependency) จาก Test ก่อนหน้า การเปิด Parallelism อาจทำให้ Test ล้มเหลวได้
✅ บทสรุปและข้อแนะนำจาก Senior Architect
เพื่อให้มั่นใจว่า Test Suite ของคุณมีความเสถียรและรันตามลำดับที่ต้องการเสมอ:
- ใช้ Numeric Prefixes: ใช้
01-,02-เพื่อควบคุมลำดับการรัน Test Suite ที่สำคัญ - ระวัง State Dependency: หาก Test A ต้องใช้ข้อมูลที่สร้างโดย Test B ห้ามเปิด Parallelism เด็ดขาด หรือให้ใช้ Fixtures เพื่อจัดการสถานะข้อมูลแทน
- ทำความเข้าใจขอบเขต: จำไว้ว่าการจัดเรียงตามตัวอักษรคือหลักการพื้นฐาน แต่ Parallelism คือข้อยกเว้นที่ต้องระวัง
การเข้าใจกลไกเหล่านี้จะช่วยให้คุณออกแบบ Test Suite ที่มีประสิทธิภาพและสามารถพึ่งพาได้ในสภาพแวดล้อมการพัฒนาที่ซับซ้อน