จาก Acceptance Criteria สู่ Test Conditions
หลังจากอ่าน requirement เป็นแล้ว ขั้นต่อไปคือการเอา acceptance criteria ที่ทีมตกลงกันแล้ว มาแตกเป็น รายการสิ่งที่ต้องทดสอบจริง เพื่อไม่ให้ทีมทดสอบแค่ happy path แล้วพลาด business rule, validation และค่าขอบเขตสำคัญ
จบบทนี้แล้วคุณจะ...
- อธิบายความต่างระหว่าง requirement, acceptance criteria และ test condition ได้ชัดขึ้น
- มอง acceptance criteria 1 ข้อให้ออกว่าแยกเป็น success path, failure path, alternate path และ boundary ได้อย่างไร
- แตก criteria สั้น ๆ ให้กลายเป็น test conditions หลายรายการอย่างมีเหตุผล ไม่ใช่เดาสุ่ม
- รู้ว่าเมื่อไร condition ไหนควรให้ความสำคัญก่อนตาม business risk
- พร้อมต่อยอดจาก test conditions ไปสู่ scenario, case หรือ checklist ในบทถัดไป
สามชั้นที่ค่อย ๆ ลงจาก "ความต้องการ" ไปสู่ "สิ่งที่ต้องพิสูจน์"
หลายทีมใช้สามคำนี้ปนกันจนทำให้การสื่อสารงงง่ายมาก ลองแยกให้ชัดแบบนี้:
| ระดับ | หน้าที่ | คำถามที่มันตอบ | ตัวอย่าง |
|---|---|---|---|
| Requirement / User Story | บอกว่าผู้ใช้หรือธุรกิจต้องการอะไร | "เราสร้างฟีเจอร์นี้ไปเพื่ออะไร?" | "ลูกค้าต้องการใช้คูปองลดราคาในหน้า checkout" |
| Acceptance Criteria | กำหนดเกณฑ์ว่าต้องเป็นแบบไหนถึงถือว่ารับงานได้ | "ฟีเจอร์นี้ต้องทำงานอย่างไรถึงถือว่าผ่าน?" | "ถ้าคูปองถูกต้องและยังไม่หมดอายุ ระบบต้องหักส่วนลดจากยอดรวม" |
| Test Condition | ระบุรายการสิ่งที่ต้องตรวจสอบ | "มีสถานการณ์อะไรบ้างที่เราต้องทดสอบเพื่อยืนยัน criteria นี้?" | "คูปองถูก+ไม่หมดอายุ", "คูปองหมดอายุ", "คูปองขั้นต่ำไม่ถึง", "คูปองถูกแต่ใช้ซ้ำไม่ได้" |
จำสั้น ๆ แบบนี้ได้
- Requirement = สิ่งที่อยากได้
- Acceptance Criteria = เงื่อนไขที่บอกว่า "ทำถูกแล้ว"
- Test Condition = รายการที่เราต้องพิสูจน์ว่า criteria นั้นจริง
ทำไม QA ต้องแยกให้ออก
ถ้าคุณกระโดดจาก requirement ไปเขียน test case ทันที คุณมักจะ:
- ข้าม business rule ที่ซ่อนอยู่
- ทดสอบแค่ flow ปกติ
- ไม่รู้ว่าจริง ๆ แล้วตัวเองกำลังพิสูจน์ criteria ข้อไหน
แต่ถ้าคุณแยกผ่านชั้น test condition ก่อน คุณจะได้ "coverage map" ว่าต้องพิสูจน์อะไรบ้าง แล้วค่อยเลือกว่าจะเขียนเป็น scenario, case หรือ checklist ต่อ
มองหา 5 ชิ้นส่วนก่อนเสมอ
เวลาเห็น acceptance criteria 1 ข้อ ลองแยกให้ได้อย่างน้อย 5 อย่างนี้:
| สิ่งที่ต้องหา | คำถามที่ใช้ | ตัวอย่างจาก criteria "ถ้าใส่คูปองถูก ระบบหักส่วนลด" |
|---|---|---|
| Trigger | เหตุการณ์อะไรเป็นตัวเริ่ม | ผู้ใช้ใส่คูปอง |
| Data | ใช้ข้อมูลอะไรตัดสิน | รหัสคูปอง, ยอดรวม, วันหมดอายุ |
| Rule | มีกฎอะไรอยู่ในประโยคนี้ | คูปองต้อง "ถูก" และ "ใช้ได้" |
| Result | ถ้าผ่านแล้วเกิดอะไร | หักส่วนลดจากยอดรวม |
| Restriction / Hidden Rule | มีข้อจำกัดที่ยังไม่ได้พูดเต็มไหม | ใช้ได้กี่ครั้ง, ใช้กับสินค้าประเภทไหน, ใช้ร่วมกับโปรอื่นได้ไหม |
สัญญาณว่า criteria ยังแตกต่อไม่ได้
ถ้าคุณอ่าน criteria แล้วตอบคำถามพวกนี้ไม่ได้ แปลว่ายังไม่พร้อมพอ:
- ข้อมูลที่ใช้ตัดสินมีอะไรบ้าง?
- สิ่งที่ถือว่า "ผ่าน" คืออะไรแน่?
- ถ้าไม่ผ่าน ต้องแสดงอะไร?
- มีขอบเขตตัวเลข, เวลา, จำนวนครั้ง, หรือสถานะไหนเกี่ยวข้องไหม?
ตัวอย่าง criteria ที่ยังเบลอ:
"ผู้ใช้สามารถใช้คูปองได้ถ้าคูปองถูกต้อง"
คำว่า "ถูกต้อง" ยังรวมอะไรบ้าง?
- format ถูก?
- มีอยู่ในระบบ?
- ยังไม่หมดอายุ?
- ยังไม่ถูกใช้เกิน quota?
- ใช้กับสินค้านี้ได้?
- ยอดถึงขั้นต่ำ?
คำเดียวอาจซ่อน test conditions ได้เป็นสิบข้อ
อย่าคิดแค่ Positive, Negative, Boundary อย่างเดียว ให้มอง Alternate Path ด้วย
บทเรียนพื้นฐานมักสอน 3 มุมคือ positive, negative, boundary ซึ่งถูกต้องและยังสำคัญมาก แต่ในชีวิตจริงคุณควรนึกถึง alternate path ด้วย
| มุม | แปลแบบง่าย | ตัวอย่าง |
|---|---|---|
| Positive | ใช้ถูกทุกอย่างแล้วควรผ่าน | ใส่คูปองถูก + ตรงเงื่อนไข → หักส่วนลด |
| Negative | ใช้ผิดหรือไม่ผ่านกฎแล้วต้องถูกปฏิเสธ | คูปองผิด, คูปองหมดอายุ, ยอดไม่ถึงขั้นต่ำ |
| Boundary | ค่าขอบที่มักเกิด bug | ยอด 499/500/501 บาท ถ้าขั้นต่ำคือ 500 |
| Alternate Path | ไม่ใช่ failure แต่เป็นทางเดินอีกแบบที่ระบบต้อง handle | ผู้ใช้ลบคูปองออก, เปลี่ยนสินค้าแล้วคูปองใช้ไม่ได้, เปลี่ยนวิธีจัดส่งแล้วยอดลดต่ำกว่าขั้นต่ำ |
ทำไม Alternate Path สำคัญ
หลายครั้ง bug ไม่ได้อยู่ที่ "ผิด" หรือ "ขอบ" แต่เกิดตอนผู้ใช้เปลี่ยน flow ระหว่างทาง เช่น:
- ใส่คูปองแล้วกลับไปแก้ตะกร้า
- จ่ายเงินไม่สำเร็จแล้วกลับมาลองใหม่
- ขอ reset password ซ้ำก่อนลิงก์เดิมหมดอายุ
สิ่งเหล่านี้ไม่ใช่ happy path และไม่ใช่ invalid input ตรง ๆ แต่เป็น flow ที่ระบบต้องรับให้ถูก
แตก acceptance criteria จริงทีละขั้น
ลองดูตัวอย่างนี้
Acceptance Criteria "ผู้ใช้สามารถกรอก email เพื่อสมัครสมาชิกได้ ระบบต้อง reject ถ้า email ผิด format หรือซ้ำกับของเดิม"
ขั้นที่ 1: หาเงื่อนไขหลักในประโยค
จาก criteria นี้ เราพอเห็นกฎหลัก 3 ก้อน:
- สมัครได้ถ้า email ใช้งานได้
- reject ถ้า format ผิด
- reject ถ้า email ซ้ำ
แต่ถ้าหยุดแค่นี้ coverage ยังบางมาก เพราะแต่ละก้อนยังมีรายละเอียดซ่อนอยู่
ขั้นที่ 2: ขยายคำที่กว้างเกินไป
คำว่า "format ผิด" อาจแตกย่อยได้อีก เช่น:
- ไม่มี
@ - ไม่มี domain
- มีช่องว่างกลางข้อความ
- ว่างเปล่า
- ยาวเกิน limit
- มีอักขระที่ไม่อนุญาต
คำว่า "ซ้ำ" ก็ยังไม่ชัด:
- ซ้ำแบบ case-insensitive หรือไม่?
- ถ้ามี account เดิมแต่ถูก deactivate แล้วนับเป็นซ้ำไหม?
- ถ้าเคยสมัครแต่ยังไม่ verify ล่ะ?
ขั้นที่ 3: แตกเป็น test conditions
Positive
- Email format ถูกและยังไม่มีในระบบ → สมัครสำเร็จ
- Email format ถูกและมีตัวพิมพ์ใหญ่/เล็กผสมกัน → สมัครสำเร็จถ้านโยบายรองรับ
- Email แบบ plus addressing เช่น
[email protected]→ สมัครสำเร็จถ้าระบบรองรับ
Negative: Validation
- ไม่มี
@ - มี
@แต่ไม่มี domain - มีช่องว่างต้น/ท้าย
- มีช่องว่างตรงกลาง
- ว่างเปล่า
- ยาวเกิน limit ที่ระบบกำหนด
Negative: Business Rule
- Email มีอยู่ในระบบแล้ว
- Email ซ้ำแบบต่างกันแค่ตัวพิมพ์ใหญ่/เล็ก
- Email เคยสมัครแต่ account ถูก soft-delete
- Email เคยสมัครแต่ยังไม่ verify
Boundary
- Email ความยาวต่ำสุดที่ยัง valid
- Email ความยาวสูงสุดที่ยัง valid
- Email ยาวเกินสูงสุด 1 ตัวอักษร
Alternate Path
- ผู้ใช้แก้ email จากค่าผิดเป็นค่าถูกก่อนกด submit
- ผู้ใช้ submit ซ้ำสองครั้งเพราะเน็ตช้า
บทเรียนจากตัวอย่างนี้
criteria เดียวกัน ถ้าอ่านแบบผิวเผินจะได้ 2–3 conditions แต่ถ้าอ่านแบบนักทดสอบ คุณอาจได้ 15–20 conditions โดยไม่ต้อง "คิดเยอะเกินเหตุ" แค่ไม่ปล่อยคำกว้าง ๆ ผ่านไปเฉย ๆ
บาง criteria ไม่ได้ซ่อนแค่ validation แต่ซ่อน logic ของธุรกิจ
Acceptance Criteria "ระบบต้องล็อกบัญชีหลัง login ผิด 5 ครั้งติดต่อกันภายใน 10 นาที และปลดล็อกอัตโนมัติหลัง 30 นาที"
criteria นี้มีทั้ง:
- จำนวนครั้ง
- ช่วงเวลา
- สถานะการล็อก
- เงื่อนไขการปลดล็อก
แตกเป็น test conditions แบบมีเหตุผล
Positive / Expected Behavior
- Login ผิด 4 ครั้งใน 10 นาที → ยังไม่ล็อก
- Login ผิด 5 ครั้งติดใน 10 นาที → ล็อกบัญชี
- หลังล็อกครบ 30 นาที → login ได้อีกครั้ง
Boundary
- ผิด 5 ครั้งใน 9 นาที 59 วินาที → ล็อก
- ผิด 5 ครั้งใน 10 นาที 01 วินาที → ไม่ล็อก ถ้ากฎกำหนด "ภายใน 10 นาที"
- ครบ 29 นาที 59 วินาที → ยังล็อก
- ครบ 30 นาที 00 วินาที → ปลดล็อก
Alternate Path
- Login ผิด 4 ครั้ง แล้วครั้งที่ 5 เป็น login ถูก → reset counter หรือไม่?
- ล็อกแล้วผู้ใช้กด "forgot password" → ทำได้ไหม?
- Admin ปลดล็อกก่อนครบ 30 นาที → สถานะต้องเปลี่ยนทันที
Negative / Security
- พยายาม login ตอน account ถูกล็อก → ต้องแสดงข้อความที่เหมาะสม
- account ที่ไม่มีอยู่จริงถูกยิง request ซ้ำ ๆ → ระบบนับเหมือน account ปกติไหม?
- นับต่อ account หรือต่อ IP ถ้ามาจากหลายอุปกรณ์?
สิ่งที่ criteria นี้สอนเรา
test condition ไม่ได้มีไว้แค่แตก input ผิดหรือถูก แต่มีไว้จับ:
- state transition
- timing rules
- alternate flow
- security behavior
ไม่ต้องแตกทุกอย่างเท่ากัน แต่ต้องแตกให้เหมาะกับความเสี่ยง
หลายคนพอเริ่มแตก conditions แล้วกลัวว่าจะเยอะเกินไป คำตอบคือ:
ไม่ต้องแตกทุกอย่างจนหมดจักรวาล แต่ต้องแตกให้พอกับความเสี่ยงของฟีเจอร์นั้น
ลองใช้ 3 คำถามนี้ช่วยตัดสิน:
- ถ้าพลาด condition นี้ จะกระทบธุรกิจหรือผู้ใช้มากไหม?
- condition นี้เป็นจุดที่ระบบมักพังบ่อยหรือไม่?
- ถ้าไม่เขียน condition นี้ ทีมมีโอกาสลืมหรือเข้าใจไม่ตรงกันไหม?
ตัวอย่างการจัด priority
| Priority | ควรใช้เมื่อ | ตัวอย่าง |
|---|---|---|
| High | พลาดแล้วกระทบเงิน, ความปลอดภัย, ข้อมูล, flow หลัก | payment, login, permission, order creation |
| Medium | กระทบผู้ใช้บางส่วน หรือเป็น alternate path ที่ใช้บ่อย | resend email, edit profile, promo rules บางข้อ |
| Low | edge case ที่โอกาสเกิดไม่บ่อยและกระทบจำกัด | filename แปลกมาก, locale เฉพาะบางภาษา |
การจัด priority ช่วยให้เวลาจำกัด คุณยังรู้ว่าจะต้องทดสอบอะไรก่อน
ไม่ต้องสวย แต่ต้องเชื่อม criteria กับสิ่งที่ต้องพิสูจน์ได้
ตัวอย่าง template แบบเรียบง่าย:
| ช่อง | ใช้ตอบอะไร |
|---|---|
| Condition ID | อ้างอิง condition แต่ละข้อ |
| Criteria Ref | condition นี้มาจาก AC ข้อไหน |
| Type | Positive / Negative / Boundary / Alternate |
| Condition Description | สิ่งที่ต้องพิสูจน์ |
| Expected Result | ระบบควรทำอะไร |
| Priority | High / Medium / Low |
| Notes / Risk | มีข้อควรระวังอะไร |
ตัวอย่างกรอกจริง
| Condition ID | Criteria Ref | Type | Condition Description | Expected Result | Priority |
|---|---|---|---|---|---|
| COND-01 | AC-2 | Positive | สมัครด้วย email ใหม่ที่ valid | สร้าง account สำเร็จ | High |
| COND-02 | AC-2 | Negative | สมัครด้วย email ที่ไม่มี @ |
แสดง validation error | High |
| COND-03 | AC-2 | Negative | สมัครด้วย email ซ้ำ | แสดงข้อความว่า email ถูกใช้แล้ว | High |
| COND-04 | AC-2 | Boundary | email ยาวสูงสุดที่ยัง valid | สมัครสำเร็จ | Medium |
| COND-05 | AC-2 | Alternate | submit ซ้ำเพราะเน็ตช้า | ไม่สร้าง account ซ้ำ | High |
- แตกจาก UI ก่อนแตกจากกฎธุรกิจ ทำให้ได้แต่เคสคลิกปุ่ม
- เขียน condition กว้างเกิน เช่น "ทดสอบ email invalid" โดยไม่แยกชนิดของ invalid
- ลืม alternate path เช่น กดซ้ำ, กลับไปแก้ข้อมูล, retry
- ลืม boundary ที่ผูกกับตัวเลข เวลา และจำนวนครั้ง
- เขียนซ้ำกับ acceptance criteria แบบ copy มาเฉย ๆ โดยยังไม่บอกว่า "จะทดสอบอะไรบ้าง"
ถ้าเผลอทำแบบนี้ ให้ย้อนกลับไปถามตัวเองว่า:
"รายการนี้ช่วยให้ทีมเห็นสิ่งที่ต้องพิสูจน์เพิ่มขึ้นจริงไหม?"
ถ้าไม่ แปลว่ามันยังไม่ใช่ test condition ที่ดีพอ
แบบฝึก: ลองแตก criteria ให้ครบกว่าที่ตาเห็นรอบแรก
"ผู้ใช้สามารถอัปโหลดรูปโปรไฟล์ได้ ขนาดไม่เกิน 5 MB format JPG หรือ PNG"
ดูคำตอบแนะนำ
Positive: JPG 1 MB, PNG 3 MB, JPG 4.99 MB
Negative: GIF, BMP, PDF, ไฟล์ไม่มีนามสกุล, ไฟล์ 0 byte, ไฟล์ corrupt
Boundary: 5.00 MB, 5.01 MB, 4.99 MB
Alternate: เลือกไฟล์ผิดแล้วเปลี่ยนไฟล์ใหม่, อัปโหลดซ้ำระหว่างเน็ตช้า, ลบรูปเดิมแล้วอัปโหลดใหม่
Hidden rules ที่ควรถามเพิ่ม: รองรับชื่อไฟล์ภาษาไทยไหม? บีบอัดรูปก่อนเก็บหรือไม่? เปลี่ยนรูปแล้ว cache รูปเดิมจะค้างไหม?
"ระบบต้องคำนวณค่าจัดส่งฟรีเมื่อยอดซื้อครบ 500 บาทขึ้นไป"
ดูคำตอบแนะนำ
Positive: ยอด 500, 700, 1,200 บาท → ได้ส่งฟรี
Boundary: 499, 500, 501 บาท
Alternate: ใส่คูปองแล้วทำให้ยอดสุทธิลดลงต่ำกว่า 500, ลบสินค้าออกหลังได้ส่งฟรี, เปลี่ยนจังหวัดปลายทางแล้วกฎยังใช้ไหม
คำถามสำคัญ: ใช้นับจากยอดก่อนลดหรือหลังลด? นับรวม VAT ไหม? ใช้กับสินค้าทุกประเภทหรือเฉพาะบางหมวด?
"ผู้ใช้สามารถขอ reset password ได้ไม่เกิน 3 ครั้งต่อ 15 นาที"
ดูคำตอบแนะนำ
Positive: ขอครั้งที่ 1-3 → ระบบส่งลิงก์ได้
Negative: ขอครั้งที่ 4 ใน 15 นาที → ระบบปฏิเสธและแจ้งเหตุผล
Boundary: ครั้งที่ 3 ยังผ่าน, ครั้งที่ 4 ไม่ผ่าน, ครบ 14:59 ยังจำกัดอยู่, ครบ 15:00 reset counter หรือไม่
Alternate: ขอใหม่หลังใช้ลิงก์เดิมแล้ว, ขอจากหลาย device, ขอซ้ำตอน email provider ส่งช้า
สิ่งที่ต้องเอาติดตัวไปจากบทนี้
- Acceptance Criteria บอกว่า "อะไรถึงถือว่าผ่าน" ส่วน Test Condition บอกว่า "เราต้องพิสูจน์อะไรบ้าง"
- เวลาแตก criteria ให้มองอย่างน้อย 4 มุม: positive, negative, boundary, alternate path
- คำกว้าง ๆ เช่น "ถูกต้อง", "ใช้ได้", "เหมาะสม" มักซ่อน conditions ไว้หลายข้อ
- ไม่ต้องแตกทุกอย่างเท่ากัน แต่ต้องแตกให้เหมาะกับ business risk
- Test conditions ที่ดีช่วยให้บทถัดไปเลือกได้ง่ายขึ้นว่าจะเขียนเป็น scenario, case หรือ checklist