CupCode.cc
Section 01 · Module 05 · Lesson 02 · ~24–28 นาที

จาก Acceptance Criteria สู่ Test Conditions

หลังจากอ่าน requirement เป็นแล้ว ขั้นต่อไปคือการเอา acceptance criteria ที่ทีมตกลงกันแล้ว มาแตกเป็น รายการสิ่งที่ต้องทดสอบจริง เพื่อไม่ให้ทีมทดสอบแค่ happy path แล้วพลาด business rule, validation และค่าขอบเขตสำคัญ

เวลาเรียน: 24–28 นาที ต้องรู้มาก่อน: Module 05 Lesson 01 รูปแบบ: อ่าน + แตก criteria + ฝึกคิดเป็นชุด

จบบทนี้แล้วคุณจะ...

  • อธิบายความต่างระหว่าง 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 ในบทถัดไป
1 · Requirement, Criteria, Condition ต่างกันตรงไหน

สามชั้นที่ค่อย ๆ ลงจาก "ความต้องการ" ไปสู่ "สิ่งที่ต้องพิสูจน์"

หลายทีมใช้สามคำนี้ปนกันจนทำให้การสื่อสารงงง่ายมาก ลองแยกให้ชัดแบบนี้:

ระดับ หน้าที่ คำถามที่มันตอบ ตัวอย่าง
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 ต่อ

2 · อ่าน Acceptance Criteria ยังไงให้แตกต่อได้

มองหา 5 ชิ้นส่วนก่อนเสมอ

เวลาเห็น acceptance criteria 1 ข้อ ลองแยกให้ได้อย่างน้อย 5 อย่างนี้:

สิ่งที่ต้องหา คำถามที่ใช้ ตัวอย่างจาก criteria "ถ้าใส่คูปองถูก ระบบหักส่วนลด"
Trigger เหตุการณ์อะไรเป็นตัวเริ่ม ผู้ใช้ใส่คูปอง
Data ใช้ข้อมูลอะไรตัดสิน รหัสคูปอง, ยอดรวม, วันหมดอายุ
Rule มีกฎอะไรอยู่ในประโยคนี้ คูปองต้อง "ถูก" และ "ใช้ได้"
Result ถ้าผ่านแล้วเกิดอะไร หักส่วนลดจากยอดรวม
Restriction / Hidden Rule มีข้อจำกัดที่ยังไม่ได้พูดเต็มไหม ใช้ได้กี่ครั้ง, ใช้กับสินค้าประเภทไหน, ใช้ร่วมกับโปรอื่นได้ไหม

สัญญาณว่า criteria ยังแตกต่อไม่ได้

ถ้าคุณอ่าน criteria แล้วตอบคำถามพวกนี้ไม่ได้ แปลว่ายังไม่พร้อมพอ:

  • ข้อมูลที่ใช้ตัดสินมีอะไรบ้าง?
  • สิ่งที่ถือว่า "ผ่าน" คืออะไรแน่?
  • ถ้าไม่ผ่าน ต้องแสดงอะไร?
  • มีขอบเขตตัวเลข, เวลา, จำนวนครั้ง, หรือสถานะไหนเกี่ยวข้องไหม?

ตัวอย่าง criteria ที่ยังเบลอ:

"ผู้ใช้สามารถใช้คูปองได้ถ้าคูปองถูกต้อง"

คำว่า "ถูกต้อง" ยังรวมอะไรบ้าง?

  • format ถูก?
  • มีอยู่ในระบบ?
  • ยังไม่หมดอายุ?
  • ยังไม่ถูกใช้เกิน quota?
  • ใช้กับสินค้านี้ได้?
  • ยอดถึงขั้นต่ำ?

คำเดียวอาจซ่อน test conditions ได้เป็นสิบข้อ

3 · มุมหลักที่ต้องแตกให้ครบ

อย่าคิดแค่ 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 ที่ระบบต้องรับให้ถูก

4 · Walkthrough แบบละเอียด

แตก acceptance criteria จริงทีละขั้น

ลองดูตัวอย่างนี้

Acceptance Criteria "ผู้ใช้สามารถกรอก email เพื่อสมัครสมาชิกได้ ระบบต้อง reject ถ้า email ผิด format หรือซ้ำกับของเดิม"

ขั้นที่ 1: หาเงื่อนไขหลักในประโยค

จาก criteria นี้ เราพอเห็นกฎหลัก 3 ก้อน:

  1. สมัครได้ถ้า email ใช้งานได้
  2. reject ถ้า format ผิด
  3. reject ถ้า email ซ้ำ

แต่ถ้าหยุดแค่นี้ coverage ยังบางมาก เพราะแต่ละก้อนยังมีรายละเอียดซ่อนอยู่

ขั้นที่ 2: ขยายคำที่กว้างเกินไป

คำว่า "format ผิด" อาจแตกย่อยได้อีก เช่น:

  • ไม่มี @
  • ไม่มี domain
  • มีช่องว่างกลางข้อความ
  • ว่างเปล่า
  • ยาวเกิน limit
  • มีอักขระที่ไม่อนุญาต

คำว่า "ซ้ำ" ก็ยังไม่ชัด:

  • ซ้ำแบบ case-insensitive หรือไม่?
  • ถ้ามี account เดิมแต่ถูก deactivate แล้วนับเป็นซ้ำไหม?
  • ถ้าเคยสมัครแต่ยังไม่ verify ล่ะ?

ขั้นที่ 3: แตกเป็น test conditions

Positive

  1. Email format ถูกและยังไม่มีในระบบ → สมัครสำเร็จ
  2. Email format ถูกและมีตัวพิมพ์ใหญ่/เล็กผสมกัน → สมัครสำเร็จถ้านโยบายรองรับ
  3. Email แบบ plus addressing เช่น [email protected] → สมัครสำเร็จถ้าระบบรองรับ

Negative: Validation

  1. ไม่มี @
  2. มี @ แต่ไม่มี domain
  3. มีช่องว่างต้น/ท้าย
  4. มีช่องว่างตรงกลาง
  5. ว่างเปล่า
  6. ยาวเกิน limit ที่ระบบกำหนด

Negative: Business Rule

  1. Email มีอยู่ในระบบแล้ว
  2. Email ซ้ำแบบต่างกันแค่ตัวพิมพ์ใหญ่/เล็ก
  3. Email เคยสมัครแต่ account ถูก soft-delete
  4. Email เคยสมัครแต่ยังไม่ verify

Boundary

  1. Email ความยาวต่ำสุดที่ยัง valid
  2. Email ความยาวสูงสุดที่ยัง valid
  3. Email ยาวเกินสูงสุด 1 ตัวอักษร

Alternate Path

  1. ผู้ใช้แก้ email จากค่าผิดเป็นค่าถูกก่อนกด submit
  2. ผู้ใช้ submit ซ้ำสองครั้งเพราะเน็ตช้า

บทเรียนจากตัวอย่างนี้

criteria เดียวกัน ถ้าอ่านแบบผิวเผินจะได้ 2–3 conditions แต่ถ้าอ่านแบบนักทดสอบ คุณอาจได้ 15–20 conditions โดยไม่ต้อง "คิดเยอะเกินเหตุ" แค่ไม่ปล่อยคำกว้าง ๆ ผ่านไปเฉย ๆ

5 · ตัวอย่างอีกแบบ: Criteria ที่มี business rule ซ้อนกัน

บาง criteria ไม่ได้ซ่อนแค่ validation แต่ซ่อน logic ของธุรกิจ

Acceptance Criteria "ระบบต้องล็อกบัญชีหลัง login ผิด 5 ครั้งติดต่อกันภายใน 10 นาที และปลดล็อกอัตโนมัติหลัง 30 นาที"

criteria นี้มีทั้ง:

  • จำนวนครั้ง
  • ช่วงเวลา
  • สถานะการล็อก
  • เงื่อนไขการปลดล็อก

แตกเป็น test conditions แบบมีเหตุผล

Positive / Expected Behavior

  1. Login ผิด 4 ครั้งใน 10 นาที → ยังไม่ล็อก
  2. Login ผิด 5 ครั้งติดใน 10 นาที → ล็อกบัญชี
  3. หลังล็อกครบ 30 นาที → login ได้อีกครั้ง

Boundary

  1. ผิด 5 ครั้งใน 9 นาที 59 วินาที → ล็อก
  2. ผิด 5 ครั้งใน 10 นาที 01 วินาที → ไม่ล็อก ถ้ากฎกำหนด "ภายใน 10 นาที"
  3. ครบ 29 นาที 59 วินาที → ยังล็อก
  4. ครบ 30 นาที 00 วินาที → ปลดล็อก

Alternate Path

  1. Login ผิด 4 ครั้ง แล้วครั้งที่ 5 เป็น login ถูก → reset counter หรือไม่?
  2. ล็อกแล้วผู้ใช้กด "forgot password" → ทำได้ไหม?
  3. Admin ปลดล็อกก่อนครบ 30 นาที → สถานะต้องเปลี่ยนทันที

Negative / Security

  1. พยายาม login ตอน account ถูกล็อก → ต้องแสดงข้อความที่เหมาะสม
  2. account ที่ไม่มีอยู่จริงถูกยิง request ซ้ำ ๆ → ระบบนับเหมือน account ปกติไหม?
  3. นับต่อ account หรือต่อ IP ถ้ามาจากหลายอุปกรณ์?

สิ่งที่ criteria นี้สอนเรา

test condition ไม่ได้มีไว้แค่แตก input ผิดหรือถูก แต่มีไว้จับ:

  • state transition
  • timing rules
  • alternate flow
  • security behavior
6 · รู้ได้ยังไงว่า "แตกพอแล้ว"

ไม่ต้องแตกทุกอย่างเท่ากัน แต่ต้องแตกให้เหมาะกับความเสี่ยง

หลายคนพอเริ่มแตก conditions แล้วกลัวว่าจะเยอะเกินไป คำตอบคือ:

ไม่ต้องแตกทุกอย่างจนหมดจักรวาล แต่ต้องแตกให้พอกับความเสี่ยงของฟีเจอร์นั้น

ลองใช้ 3 คำถามนี้ช่วยตัดสิน:

  1. ถ้าพลาด condition นี้ จะกระทบธุรกิจหรือผู้ใช้มากไหม?
  2. condition นี้เป็นจุดที่ระบบมักพังบ่อยหรือไม่?
  3. ถ้าไม่เขียน 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 ช่วยให้เวลาจำกัด คุณยังรู้ว่าจะต้องทดสอบอะไรก่อน

7 · Template ที่ช่วยให้คิดครบ

ไม่ต้องสวย แต่ต้องเชื่อม 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
8 · ข้อผิดพลาดที่พบบ่อยเวลาแตก Test Conditions
  • แตกจาก UI ก่อนแตกจากกฎธุรกิจ ทำให้ได้แต่เคสคลิกปุ่ม
  • เขียน condition กว้างเกิน เช่น "ทดสอบ email invalid" โดยไม่แยกชนิดของ invalid
  • ลืม alternate path เช่น กดซ้ำ, กลับไปแก้ข้อมูล, retry
  • ลืม boundary ที่ผูกกับตัวเลข เวลา และจำนวนครั้ง
  • เขียนซ้ำกับ acceptance criteria แบบ copy มาเฉย ๆ โดยยังไม่บอกว่า "จะทดสอบอะไรบ้าง"

ถ้าเผลอทำแบบนี้ ให้ย้อนกลับไปถามตัวเองว่า:

"รายการนี้ช่วยให้ทีมเห็นสิ่งที่ต้องพิสูจน์เพิ่มขึ้นจริงไหม?"

ถ้าไม่ แปลว่ามันยังไม่ใช่ test condition ที่ดีพอ

Practice

แบบฝึก: ลองแตก criteria ให้ครบกว่าที่ตาเห็นรอบแรก

  1. "ผู้ใช้สามารถอัปโหลดรูปโปรไฟล์ได้ ขนาดไม่เกิน 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 รูปเดิมจะค้างไหม?

  2. "ระบบต้องคำนวณค่าจัดส่งฟรีเมื่อยอดซื้อครบ 500 บาทขึ้นไป"

    ดูคำตอบแนะนำ

    Positive: ยอด 500, 700, 1,200 บาท → ได้ส่งฟรี

    Boundary: 499, 500, 501 บาท

    Alternate: ใส่คูปองแล้วทำให้ยอดสุทธิลดลงต่ำกว่า 500, ลบสินค้าออกหลังได้ส่งฟรี, เปลี่ยนจังหวัดปลายทางแล้วกฎยังใช้ไหม

    คำถามสำคัญ: ใช้นับจากยอดก่อนลดหรือหลังลด? นับรวม VAT ไหม? ใช้กับสินค้าทุกประเภทหรือเฉพาะบางหมวด?

  3. "ผู้ใช้สามารถขอ 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