testover · playwright · github actions

เทสแอปให้เอง
ทุกเสาร์-อาทิตย์

หน้านี้อธิบายว่าโปรเจกต์นี้ทำอะไร ทำงานเป็นลำดับยังไง และต้องตั้งค่าอะไรบ้างจึงจะได้รับข้อความ ✅ PASS / ❌ FAIL ทุกสุดสัปดาห์โดยไม่ต้องเปิดเครื่องทิ้งไว้

01 โปรเจกต์นี้กำลังทำอะไร

เรามีเว็บ Task Board (สมัครสมาชิก, login, จัดการงาน, โปรไฟล์) และชุดเทสอัตโนมัติ 127 เคส (รวมตรวจ accessibility ด้วย axe) ที่ทำงานเหมือนคนจริงๆ คือเปิดเบราว์เซอร์ กรอกข้อมูล กดปุ่ม แล้วตรวจว่าผลตรงกับที่ควรเป็น จากนั้นให้ GitHub รันชุดเทสนี้ตามเวลาที่ตั้งไว้ และส่งผลเข้าแชตของเรา

  1. GitHub ปลุกงานตามเวลา (cron)ทุกเสาร์และอาทิตย์ 09:00 เวลาไทย บนเครื่องเสมือนของ GitHub ไม่ต้องใช้คอมของเรา
  2. เตรียมเครื่องดึงโค้ด ติดตั้ง Node, ติดตั้งแพ็กเกจ และเบราว์เซอร์ Chromium
  3. เปิดเว็บที่จะเทสPlaywright สั่ง node app/server.mjs ให้เองที่พอร์ต 3000
  4. รันเทส 127 เคสถ้าเคสไหนพัง จะลองใหม่อีก 2 ครั้ง (กันเคสที่ล้มเพราะจังหวะ) แล้วเก็บ screenshot/video/trace ไว้
  5. บันทึกผลเป็นไฟล์ได้ test-results/results.json และรายงาน HTML อัปโหลดเก็บไว้ 14 วัน
  6. ส่งแจ้งเตือนscripts/notify.mjs อ่านผล สรุปเป็นข้อความ แล้วยิงเข้า Webhook ของ Discord/Slack — ทำเสมอ ไม่ว่าผ่านหรือพัง
ทำไมส่งทั้งตอนผ่านและตอนพัง? ถ้าส่งเฉพาะตอนพัง เมื่อไม่มีข้อความเข้าเราแยกไม่ออกว่า "ทุกอย่างปกติ" หรือ "ระบบไม่ได้รันเลย"

02 ไฟล์แต่ละตัวทำหน้าที่อะไร

ไฟล์หน้าที่
app/index.htmlเว็บที่ถูกเทส: สมัครสมาชิก/login (demo/demo1234 มีให้ตั้งแต่เริ่ม), task board (priority, แก้, ลบ, ค้นหา, กรอง), โปรไฟล์ (เปลี่ยนชื่อ/รหัสผ่าน, dark mode, ลบบัญชี) เก็บข้อมูลใน localStorage
app/server.mjsเซิร์ฟเวอร์เล็กๆ เสิร์ฟหน้าเว็บ ไม่ต้องติดตั้งอะไรเพิ่ม
tests/support/pages.tsPage Object (AuthPage, TasksPage, ProfilePage) ให้ทุกเคสใช้ท่าเดียวกัน แก้ที่เดียวเมื่อหน้าเว็บเปลี่ยน
tests/login.spec.tsสมัครสมาชิก, login/logout, ผู้ที่ยังไม่ login เข้าหน้าภายในไม่ได้, session, หน้า 404, title
tests/tasks.spec.tsเพิ่ม/แก้/ลบ/ติ๊กเสร็จ, ค้นหา, กรอง, Clear completed, ข้อมูลคงอยู่หลัง reload
tests/profile.spec.tsเปลี่ยนชื่อ, เปลี่ยนรหัสผ่าน, dark mode, ลบบัญชี
tests/journey.spec.tsเส้นทางเต็มตั้งแต่สมัครจนลบบัญชี, ผู้ใช้ 2 คนข้อมูลไม่ปนกัน, จอมือถือ, ข้อมูลใน storage เสีย
playwright.config.tsตั้งค่า retry, เก็บหลักฐานตอนพัง, เปิดเว็บให้เอง, สร้าง results.json
scripts/notify.mjsอ่าน results.json แล้วส่งข้อความเข้า WEBHOOK_URL
tests/a11y.spec.tsaxe ตรวจ accessibility (WCAG 2.1 A/AA) ทุกหน้าและทุกสถานะสำคัญ รวมโหมดมืด
.github/workflows/smoke.ymlชุดเร็ว @smoke ทุกครั้งที่ push เข้า main และทุก pull request (ไม่ส่ง webhook)
.github/workflows/weekend-e2e.ymlรันทุกเคสเสาร์-อาทิตย์ตามเวลาที่ตั้ง แล้วแจ้งผลเข้า webhook

03 เช็กลิสต์ตั้งค่า (ติ๊กตามได้)

สถานะที่ติ๊กจะจำไว้ในเบราว์เซอร์นี้

04 สร้าง Webhook

Webhook คือ URL ที่ใครก็ตามที่มี URL นี้ ส่งข้อความเข้าช่องแชตได้ สคริปต์ของเราส่งทั้งฟิลด์ content (Discord) และ text (Slack) จึงใช้ได้ทั้งสองที่โดยไม่ต้องแก้โค้ด

  1. คลิกขวาที่ช่องที่ต้องการ → Edit Channel
  2. Integrations → Webhooks → New Webhook
  3. ตั้งชื่อ เช่น QA Bot เลือกช่อง
  4. กด Copy Webhook URL (หน้าตา https://discord.com/api/webhooks/…)
Webhook URL คือรหัสลับ — ห้ามใส่ในโค้ดหรือ commit เก็บใน GitHub Secrets เท่านั้น ถ้าหลุดให้ลบ webhook เดิมแล้วสร้างใหม่ทันที

05 ตั้งเวลารัน (cron)

เวลาถูกกำหนดในไฟล์ .github/workflows/weekend-e2e.yml บรรทัด cron ซึ่ง GitHub ใช้เวลา UTC เสมอ (ไทย = UTC+7) เลยต้องแปลงก่อน ลองใช้ตัวช่วยนี้:

วัน (เวลาไทย)
0 2 * * 6,0

      
    

กฎสั้นๆ ที่ควรจำ

ทดสอบ schedule: ชั่วคราวเปลี่ยนเป็น */10 * * * * แล้ว push รอดูว่าข้อความเข้า แล้ว เปลี่ยนกลับทันที ไม่เช่นนั้นจะรันทุก 10 นาที

06 ข้อความที่จะได้รับ

✅ PASS — weekend QA run passed: 127 | failed: 0 | flaky: 0 | skipped: 0 https://github.com/<user>/<repo>/actions/runs/123456789
❌ FAIL — weekend QA run passed: 126 | failed: 1 | flaky: 0 | skipped: 0 • Task board › completing, editing, deleting › deletes only the targeted task https://github.com/<user>/<repo>/actions/runs/123456789

flaky = เคสที่พังก่อนแต่ผ่านตอนลองใหม่ ถ้าขึ้นบ่อยควรตามแก้ กดลิงก์แล้วโหลด artifact playwright-report เพื่อดู screenshot, video, trace ของเคสที่พัง

07 ถ้าไม่เป็นไปตามคาด

อาการตรวจอะไร
workflow รันแต่ไม่มีข้อความเข้ายังไม่ตั้ง secret WEBHOOK_URL หรือชื่อผิด (log จะเขียน skipping send)
Webhook responded 404webhook ถูกลบหรือ URL ผิด สร้างใหม่แล้วอัปเดต secret
Webhook responded 429ส่งถี่เกินไป ลดความถี่ cron
ไม่รันตามเวลาเลยยังไม่ push ไป main / schedule ถูกปิดหลัง 60 วันไม่มีกิจกรรม
รันผิดวันลืมแปลง UTC ใช้ตัวช่วยหัวข้อ 05
พังเฉพาะบน GitHubดู trace ใน artifact แล้ว npx playwright show-trace <ไฟล์>

รายละเอียดเพิ่มเติมอยู่ใน README.md