QA Checklist: ทดสอบการสมัครสมาชิก + OTP ด้วยอีเมลชั่วคราว (Disposable Email) ให้ครบทุกเคส
ฟลว์สมัครสมาชิกและ OTP เป็นจุดที่ทำให้ผู้ใช้ “หลุด” ได้ง่ายที่สุด เพราะมันรวมหลายระบบไว้ในจุดเดียว: ฝั่งฟอร์ม, API, rate limit, anti-bot, ตัวส่งอีเมล, เทมเพลต, ลิงก์ยืนยัน, และกล่องรับเมลของผู้ใช้ ถ้า QA ทดสอบด้วยอีเมลจริงอย่างเดียว ผลอาจดูดีเกินจริง เพราะผู้ใช้จำนวนมากเลือกใช้อีเมลชั่วคราว หรือโดเมนที่ระบบมองว่าเสี่ยง ทำให้เกิดเคส “OTP ไม่เข้า” ทั้งที่ระบบปกติ
บทความนี้คือเช็กลิสต์ QA แบบใช้งานได้จริง เพื่อทดสอบ Signup + OTP เมื่อผู้ใช้ใช้ Disposable Email ครอบคลุมทั้งเคสทางเทคนิค เคส UX และเคสความปลอดภัย โดยออกแบบให้ทีม QA/PM/Dev ใช้ร่วมกันได้ และลดความสับสนระหว่าง “บั๊กจริง” กับ “ข้อจำกัดของผู้ให้บริการอีเมลชั่วคราว”
เป้าหมายการทดสอบ: ต้องตอบให้ได้ 4 ข้อนี้
- ส่งได้ไหม: ระบบส่ง OTP/อีเมลยืนยันไปถึงกล่องรับได้สม่ำเสมอหรือไม่
- รับได้ไหม: ผู้ใช้เห็น OTP/ลิงก์ได้ทันเวลา และนำไปใช้สำเร็จหรือไม่
- แก้ปัญหาได้ไหม: ถ้าเมลไม่เข้า ดีเลย์ หรือถูกบล็อก UX/ข้อความช่วยเหลือเพียงพอหรือไม่
- ปลอดภัยไหม: ป้องกันการสแปม การ brute force การโจมตีด้วยการรีเซนด์ และการรั่วของข้อมูลได้หรือไม่
เตรียมตัวก่อนเทสต์ (Pre-test Setup)
1) ชุดโดเมน/ผู้ให้บริการที่ใช้ทดสอบ
การทดสอบด้วย “เมลชั่วคราวเจ้าเดียว” มักทำให้ผลเอนเอียง เพราะแต่ละผู้ให้บริการมีคุณภาพและอัตราถูกบล็อกต่างกัน แนะนำให้เตรียมอย่างน้อย 3 กลุ่ม:
- กลุ่ม A: Disposable Email ที่อายุสั้น — เพื่อทดสอบเคสหมดเวลา/ดีเลย์/รีเซนด์
- กลุ่ม B: Temporary Email ที่ยืดหยุ่นกว่า — เพื่อทดสอบเคสขั้นตอนหลายหน้าและการรอเมล
- กลุ่ม C: อีเมลปกติ (control) — เพื่อแยกปัญหาระหว่างระบบของเรา vs ผู้ให้บริการเมลชั่วคราว
2) ตั้งค่าการบันทึกหลักฐาน (Evidence)
- บันทึกเวลา: เวลากด “ส่ง OTP” และเวลาเมลเข้าจริง เพื่อวัด latency
- เก็บ screenshot/recording: หน้า UI, ข้อความ error, และหน้ากล่องรับเมล
- เก็บ request_id/trace_id: ถ้าระบบมี เพื่อให้ dev ไล่ log ได้เร็ว
- แยก environment: staging vs production เพื่อไม่สับสนเรื่อง rate limit และ provider policy
3) กำหนดเกณฑ์ผ่าน/ไม่ผ่าน (Pass/Fail Criteria)
ให้ตกลงร่วมกันก่อนว่าอะไรคือ “ล้มเหลวของระบบเรา” และอะไรคือ “ข้อจำกัดภายนอก” เช่น ถ้าโดเมนถูกบล็อกตั้งใจ ต้องแสดงข้อความที่เหมาะสมและเสนอทางเลือก ไม่ใช่ปล่อยให้ผู้ใช้ค้าง
Checklist: ฟลว์สมัครสมาชิก (Signup) ด้วย Disposable Email
1) Form Validation & UX
- ตรวจรูปแบบอีเมลถูกต้อง (format) และแสดงข้อความชัดเจน
- กด submit ซ้ำเร็ว ๆ แล้วไม่เกิด request ซ้อน/สมัครซ้ำ
- สถานะ loading ชัดเจน และป้องกันการกดรัว
- รองรับคีย์บอร์ดมือถือ: next/submit ทำงานถูกต้อง
- กรณี network ช้า: UI ไม่ค้าง และมีการแจ้งเตือนที่เหมาะสม
2) Domain Handling (โดเมนเสี่ยง/โดเมนถูกบล็อก)
- ถ้าโดเมนถูกบล็อก: แสดงข้อความแบบ “อธิบายได้” ไม่กล่าวโทษผู้ใช้
- บอกเหตุผลเชิงฟังก์ชัน: เช่น “โดเมนนี้มักมีปัญหาในการรับ OTP” มากกว่า “ห้ามใช้” แบบทื่อ ๆ
- เสนอทางเลือก: แนะนำใช้อีเมลอื่น หรือวิธีรับ OTP แบบอื่น (ถ้ามี)
- อย่ารั่วข้อมูล policy ภายในละเอียดเกินไป (เพื่อเลี่ยงการถูกโจมตีปรับโดเมนหนี)
3) Duplicate & Reuse Cases
- ใช้อีเมลเดียวสมัครซ้ำ: ระบบตอบกลับเหมาะสม (เช่น “อีเมลนี้ถูกใช้แล้ว”) และไม่เปิดเผยมากเกินจำเป็น
- บัญชียังไม่ยืนยัน: สมัครซ้ำแล้วระบบจัดการสถานะอย่างไร (ส่ง OTP ใหม่, หรือให้ไปยืนยันเดิม)
- เคส race condition: เปิดสองแท็บสมัครพร้อมกัน แล้วสถานะไม่เพี้ยน
Checklist: การส่ง OTP/อีเมลยืนยัน (Delivery)
1) ความถูกต้องของเนื้อหา OTP
- OTP ความยาวถูกต้อง (เช่น 6 หลัก) และเป็นตัวเลข/อักษรตามที่กำหนด
- OTP มี expiry ตาม policy และ UI บอกเวลาหรือเงื่อนไขชัดเจน
- ข้อความในเมลไม่ทำให้สับสน: ระบุว่าใช้สำหรับ “สมัครสมาชิก/ยืนยันอีเมล” ไม่ใช่ reset password
- ภาษาที่ใช้ถูกต้องตาม locale และไม่เพี้ยนบนมือถือ
2) Latency & Delay Handling
- วัดเวลาตั้งแต่กดส่งจนเมลเข้าจริง ในหลายรอบทดสอบ
- ถ้าเมลมาช้า: UI มีคำแนะนำ เช่น ตรวจสแปม/รีเฟรช/รอสักครู่
- ถ้าครบช่วงเวลาหนึ่งแล้วยังไม่มา: มีปุ่ม resend และมีเงื่อนไขที่ไม่ทำให้สแปม
- ระบบไม่ควรตอบว่า “ส่งแล้ว” ทั้งที่ provider ตีกลับทันทีโดยที่เรารู้ได้
3) Resend OTP & Rate Limiting
- resend ได้ตามจำนวน/ช่วงเวลาที่กำหนด และ UI สื่อสารชัด
- กด resend รัว ๆ: ต้องถูก throttle และไม่ทำให้ระบบส่งเมลถล่ม
- เมื่อ resend แล้ว OTP เก่าควรเป็นอย่างไร: ใช้ได้/ใช้ไม่ได้ ต้องชัดเจน
- ตรวจว่า OTP ล่าสุดเท่านั้นที่ valid (ถ้านโยบายเป็นแบบนั้น)
4) Bounce / Undeliverable Handling
- กรณี provider ส่งไม่สำเร็จ: ระบบบันทึกเหตุการณ์ และสามารถอธิบายให้ผู้ใช้เข้าใจได้
- แสดง error แบบไม่เปิดเผยข้อมูลมากเกิน: ไม่ควรบอกว่าบัญชีมีอยู่/ไม่มีอยู่ในบางฟลว์
- มี fallback guidance: เปลี่ยนอีเมล, ลองใหม่, หรือช่องทางยืนยันอื่น (ถ้ามี)
Checklist: หน้ากรอก OTP (Verification)
1) การกรอก OTP และความทนทานต่อข้อผิดพลาด
- รองรับการวาง (paste) OTP ทั้งชุด
- รองรับ auto-advance ช่อง OTP (ถ้าเป็นแบบหลายช่อง) และ backspace ทำงานถูกต้อง
- กรอกผิด: ข้อความ error ชัดเจน ไม่กล่าวโทษ และไม่รีเซ็ตฟอร์มแบบน่ารำคาญ
- กรอกถูกแต่หมดอายุ: ต้องแยกข้อความจากกรณีกรอกผิด
2) Expiry, Session, และการนำทาง
- OTP หมดอายุ: แสดงแนวทางต่อ เช่น resend หรือกลับไปเปลี่ยนอีเมล
- รีเฟรชหน้า: session ยังอยู่หรือไม่ และ UX ไม่พัง
- เปิดในแท็บใหม่: state ไม่เพี้ยน และไม่ยืนยันผิดบัญชี
- กลับไปแก้อีเมล: flow ไม่ตัน และไม่เกิดบัญชีค้างหลายตัวโดยไม่จำเป็น
3) Messaging ที่ควรมีบนหน้ากรอก OTP
- บอกอีเมลปลายทางแบบ mask เพื่อความมั่นใจของผู้ใช้
- บอกให้ตรวจกล่องรับ/สแปม และบอกว่าเมลอาจใช้เวลาสักครู่
- มีปุ่มเปลี่ยนอีเมล/ย้อนกลับที่ชัดเจน
Checklist: ความปลอดภัย (Security) ที่ต้องทดสอบจริง
1) Brute Force & Enumeration
- ลองเดา OTP ผิดหลายครั้ง: ระบบต้องจำกัดความพยายาม (attempt limit)
- ตรวจว่าข้อความ error ไม่เผยข้อมูลว่าอีเมลนี้มีบัญชีหรือไม่ (ป้องกัน enumeration)
- ถ้า lock ชั่วคราว: ระยะเวลาและข้อความต้องชัดเจน และไม่เปิดช่องให้โจมตีต่อ
2) Replay & OTP Reuse
- OTP ที่ใช้แล้ว ต้องใช้ซ้ำไม่ได้ (ถ้า policy กำหนด)
- OTP จากรอบ resend เก่า ไม่ควรใช้ยืนยันได้ (ถ้าใช้ latest-only)
- OTP ควรถูกผูกกับ session/transaction ที่เหมาะสม ลดโอกาสนำไปใช้กับบัญชีอื่น
3) Abuse จาก Disposable Email
- ลองสร้างหลายบัญชีด้วยโดเมนเดียว: ระบบมีสัญญาณกันสแปมอย่างไร
- ตรวจ rate limit ต่อ IP/อุปกรณ์/โดเมน และผลกระทบกับผู้ใช้จริง
- ถ้ามี CAPTCHA/anti-bot: ต้องทดสอบว่ามี false-positive มากไปจนสมัครไม่ผ่านหรือไม่
4) ข้อมูลในอีเมล (Privacy)
- อีเมล OTP ไม่ควรมีข้อมูลส่วนตัวเกินจำเป็น
- ลิงก์ยืนยันควรมี token ที่คาดเดายาก และหมดอายุได้
- ไม่แสดง OTP แบบชัด ๆ ใน notification ที่เสี่ยง (ถ้ามีทางเลือก)
Checklist: เคสที่คนมักลืม แต่เจอบ่อยในสนามจริง
1) เมลเข้าช้า แต่ผู้ใช้กด resend ไปแล้ว
เคสนี้ทำให้ผู้ใช้สับสนมาก เพราะอยู่ดี ๆ จะมี OTP หลายฉบับเข้าพร้อมกัน QA ต้องทดสอบว่า UI อธิบายได้ไหมว่า “ให้ใช้รหัสล่าสุด” หรือ “รหัสเดิมยังใช้ได้” และระบบ backend ตัดสินใจสอดคล้องกับข้อความบนหน้าจอหรือไม่
2) OTP ส่งแล้ว แต่ผู้ใช้ปิดแอป/ปิดแท็บ
บนมือถือ ผู้ใช้ปิดแอปง่ายมาก แล้วกลับมาใหม่ state อาจหาย QA ควรทดสอบว่าเมื่อกลับมาแล้ว flow ยังพาไปต่อได้อย่างเป็นมิตร หรืออย่างน้อยมีทางกลับไปขอ OTP ใหม่โดยไม่ต้องเริ่มทุกอย่างใหม่
3) ผู้ใช้คัดลอก OTP พร้อมช่องว่าง/ตัวอักษรพิเศษ
OTP บางครั้งถูกคัดลอกมาพร้อมเว้นวรรค หรือมีเครื่องหมายแปลก ๆ จากแอปอื่น ระบบควร trim และยอมรับ input ที่สมเหตุสมผล ไม่ควร fail แบบไร้เหตุผล
4) โดเมน Disposable ถูกบล็อกแบบเงียบ ๆ
บางระบบไม่บอกชัดว่า “โดเมนนี้รับไม่ได้” แต่ปล่อยให้ส่งแล้วดูเหมือนสำเร็จ ผลคือผู้ใช้รออย่างเดียวแล้วก็เลิกใช้ QA ต้องทดสอบว่าเมื่อมีสัญญาณส่งไม่สำเร็จ เราสามารถแจ้งผู้ใช้ให้เปลี่ยนวิธีได้เร็วแค่ไหน
แนวทางรายงานบั๊กให้แก้ไว (Bug Report Template)
- Scenario: สมัครใหม่/เข้าสู่ระบบ/ยืนยันอีเมล/OTP
- Email type: Disposable/Temporary/ปกติ (ระบุกลุ่ม A/B/C)
- Steps: กดอะไรบ้าง ทีละขั้น
- Expected: ควรเกิดอะไร
- Actual: เกิดอะไรจริง (แนบภาพ/วิดีโอ)
- Timestamps: เวลากดส่ง + เวลาเมลเข้า (ถ้าเข้า)
- Network/Device: มือถือ/เดสก์ท็อป/บราวเซอร์/เครือข่าย
- Trace: request_id/trace_id (ถ้ามี)
สรุป: ทำให้ฟลว์ OTP “ไม่พัง” แม้ผู้ใช้ใช้เมลชั่วคราว
Disposable Email ทำให้โลกความจริงซับซ้อนขึ้น เพราะมันเพิ่มความไม่แน่นอนด้าน delivery และการถูกบล็อก แต่ถ้าทีม QA มีเช็กลิสต์ที่ครอบคลุม คุณจะจับปัญหาได้ก่อนผู้ใช้ และแยกให้ออกว่าอะไรคือบั๊กของเรา อะไรคือข้อจำกัดภายนอก พร้อมออกแบบ UX ให้ช่วยผู้ใช้แก้ปัญหาได้ด้วยตัวเอง
จุดชนะไม่ได้อยู่ที่ “ส่ง OTP ได้ครั้งเดียว” แต่อยู่ที่ “ส่งได้สม่ำเสมอ + อธิบายได้เมื่อเกิดปัญหา + ปลอดภัยจาก abuse” เมื่อสามอย่างนี้ครบ ฟลว์สมัครสมาชิกของคุณจะลื่นขึ้นทันที และ conversion จะดีขึ้นแบบที่วัดได้จริง