Section 02 · Module 04 · Lesson 02 · ~15–20 นาที

State Transition Testing

หลายระบบไม่ได้ตอบสนองแค่ตาม input — มันตอบสนองตาม 'สถานะปัจจุบัน' ด้วย และ State Transition Testing คือเทคนิคที่จัดการกับสิ่งนี้

เวลาเรียน: 15–20 นาที ต้องรู้มาก่อน: Lesson 07 - Decision Table Testing รูปแบบ: อ่าน + แบบฝึกสั้นๆ

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

  • อธิบายได้ว่า State Transition Testing คืออะไร
  • วาด state diagram จาก requirement ได้
  • สร้าง state transition table ได้
  • ระบุ invalid transitions ที่ต้องเทสต์ได้
1 · เมื่อระบบมี "ความจำ"

พฤติกรรมเปลี่ยนตาม "สถานะ"

ลองนึกถึงตู้ ATM — ถ้าคุณกดรหัสผิดครั้งแรก ระบบจะบอกว่า "กรุณาลองอีกครั้ง" แต่ถ้ากดผิดครั้งที่สาม ระบบจะกลืนบัตร input เหมือนกัน (รหัสผิด) แต่ผลลัพธ์ต่างกัน เพราะ "สถานะ" ของระบบเปลี่ยนไปแล้ว

ระบบแบบนี้มีอยู่ทุกที่:

  • Order status: Pending → Confirmed → Shipped → Delivered
  • User account: Active → Suspended → Deactivated
  • Login: ถูก → ผิดครั้งที่ 1 → ผิดครั้งที่ 2 → ล็อก
  • Bug tracking: New → Assigned → In Progress → Fixed → Verified → Closed

EP, BVA, และ Decision Table ไม่มีเครื่องมือจัดการ "สถานะ" — State Transition Testing ถูกออกแบบมาเพื่อเรื่องนี้โดยเฉพาะ

2 · องค์ประกอบของ State Transition

4 สิ่งที่ต้องรู้จัก

States (สถานะ): สถานะที่ระบบอยู่ ณ เวลาหนึ่ง

  • เช่น: "รอชำระเงิน", "ชำระแล้ว", "กำลังจัดส่ง"

Transitions (การเปลี่ยนสถานะ): การย้ายจากสถานะหนึ่งไปอีกสถานะ

  • เช่น: "รอชำระเงิน" → "ชำระแล้ว"

Events (เหตุการณ์): สิ่งที่ทำให้เกิด transition

  • เช่น: "ลูกค้ากดชำระเงิน" ทำให้เปลี่ยนจาก "รอชำระ" เป็น "ชำระแล้ว"

Guards/Conditions (เงื่อนไข): เงื่อนไขที่ต้องเป็นจริงเพื่อให้ transition เกิดขึ้น

  • เช่น: "ชำระเงินสำเร็จ" (ถ้าไม่สำเร็จ จะไม่เปลี่ยนสถานะ)
3 · State Diagram

วาดภาพให้เห็น Flow

ตัวอย่าง: Order Status Flow

[New] --(ลูกค้ายืนยัน)--> [Confirmed]
[Confirmed] --(ชำระเงิน)--> [Paid]
[Confirmed] --(ยกเลิก)--> [Cancelled]
[Paid] --(จัดส่ง)--> [Shipped]
[Paid] --(ขอคืนเงิน)--> [Refunded]
[Shipped] --(ลูกค้าได้รับ)--> [Delivered]
[Shipped] --(สินค้าสูญหาย)--> [Lost]
[Delivered] --(ขอคืนสินค้า ภายใน 7 วัน)--> [Return Requested]
[Return Requested] --(อนุมัติ)--> [Refunded]
[Return Requested] --(ปฏิเสธ)--> [Delivered]

States: New, Confirmed, Paid, Shipped, Delivered, Cancelled, Refunded, Lost, Return Requested Events: ยืนยัน, ชำระเงิน, ยกเลิก, จัดส่ง, ขอคืนเงิน, ได้รับ, สูญหาย, ขอคืนสินค้า, อนุมัติ, ปฏิเสธ

4 · State Transition Table

จัดข้อมูลเป็นตาราง

สถานะปัจจุบัน Event สถานะถัดไป เงื่อนไข
New ลูกค้ายืนยัน Confirmed -
Confirmed ชำระเงิน Paid ชำระสำเร็จ
Confirmed ยกเลิก Cancelled -
Paid จัดส่ง Shipped มีสินค้าพร้อมส่ง
Paid ขอคืนเงิน Refunded ก่อนจัดส่ง
Shipped ลูกค้าได้รับ Delivered -
Shipped สินค้าสูญหาย Lost -
Delivered ขอคืนสินค้า Return Requested ภายใน 7 วัน
Return Requested อนุมัติ Refunded -
Return Requested ปฏิเสธ Delivered -

จาก table นี้ แต่ละแถว = 1 test case

5 · Invalid Transitions

สิ่งที่ "ไม่ควรเกิดขึ้น" แต่ต้องเทสต์

Invalid transitions คือการเปลี่ยนสถานะที่ไม่ควรเป็นไปได้ — ระบบต้อง block ไม่ให้เกิด:

สถานะปัจจุบัน Event ที่ลอง Expected
New จัดส่ง Error: ต้องยืนยันและชำระเงินก่อน
Cancelled ชำระเงิน Error: order ถูกยกเลิกแล้ว
Delivered จัดส่ง Error: จัดส่งแล้ว
Shipped ยกเลิก Error: สินค้าจัดส่งแล้ว ไม่สามารถยกเลิกได้
Delivered ขอคืนสินค้า (หลัง 7 วัน) Error: เลยกำหนดเวลาคืนสินค้า

เรื่องเล่า: ระบบ e-commerce แห่งหนึ่งมีบั๊กที่ลูกค้าสามารถ "ขอคืนเงิน" จาก order ที่อยู่ในสถานะ "Cancelled" ได้ ทำให้ได้เงินคืนทั้งที่ไม่เคยจ่าย เพราะทีม dev ลืม validate ว่า "Cancelled" ไม่ควรมี transition ไปที่ "Refunded"

Invalid transitions เป็นสิ่งที่ QA ต้องเทสต์เสมอ — เพราะมันคือช่องทางที่ hacker หรือบั๊กจะใช้ทำให้ระบบอยู่ใน "สถานะที่เป็นไปไม่ได้"

6 · สร้าง Test Cases จาก State Transitions

Valid + Invalid = ครอบคลุม

Valid transition tests: เทสต์ทุก transition ที่ถูกต้อง

  • TC-ST-001: New → Confirmed (ลูกค้ายืนยัน)
  • TC-ST-002: Confirmed → Paid (ชำระเงินสำเร็จ)
  • TC-ST-003: Confirmed → Cancelled (ยกเลิก)
  • ...ทุก transition ใน table

Invalid transition tests: เทสต์ transitions ที่ไม่ควรเกิด

  • TC-ST-011: New → Shipped (ควร error)
  • TC-ST-012: Cancelled → Paid (ควร error)
  • ...สิ่งที่ "ไม่ควรเกิด"

Sequence tests: เทสต์ลำดับ transitions ติดต่อกัน

  • TC-ST-021: New → Confirmed → Paid → Shipped → Delivered (happy path ครบวงจร)
  • TC-ST-022: New → Confirmed → Cancelled (ยกเลิกก่อนชำระ)
  • TC-ST-023: New → Confirmed → Paid → Shipped → Delivered → Return Requested → Refunded
Practice

แบบฝึก: สร้าง State Diagram และ Transition Table จาก Order Status

Requirement สำหรับระบบจัดการ Bug Tracking:

  • Bug ถูกสร้าง → สถานะ "Open"
  • Dev เริ่มทำ → สถานะ "In Progress"
  • Dev แก้เสร็จ → สถานะ "Fixed"
  • QA เทสต์ผ่าน → สถานะ "Verified"
  • QA เทสต์ไม่ผ่าน → สถานะ "Reopened"
  • Reopened → Dev เริ่มทำอีกครั้ง → "In Progress"
  • Verified → PM ปิด → สถานะ "Closed"
  • Open หรือ In Progress → PM ตัดสินใจ "ไม่แก้" → สถานะ "Won't Fix"
  1. ระบุ states ทั้งหมดในระบบ

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

    States ทั้งหมด 7 สถานะ:

    1. Open — เพิ่งสร้าง ยังไม่มีคนรับ
    2. In Progress — Dev กำลังแก้
    3. Fixed — Dev แก้เสร็จแล้ว รอ QA เทสต์
    4. Verified — QA เทสต์ผ่าน
    5. Reopened — QA เทสต์ไม่ผ่าน ส่งกลับ
    6. Closed — PM ปิด
    7. Won't Fix — ตัดสินใจไม่แก้
  • สร้าง state transition table ที่มี valid transitions ทั้งหมด

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

    <div class="table-wrap"><table class="prose-table">
    <thead>
    <tr>
    <th>สถานะปัจจุบัน</th>
    <th>Event</th>
    <th>สถานะถัดไป</th>
    </tr>
    </thead>
    <tbody><tr>
    <td>Open</td>
    <td>Dev เริ่มทำ</td>
    <td>In Progress</td>
    </tr>
    <tr>
    <td>Open</td>
    <td>PM ตัดสินใจไม่แก้</td>
    <td>Won&#39;t Fix</td>
    </tr>
    <tr>
    <td>In Progress</td>
    <td>Dev แก้เสร็จ</td>
    <td>Fixed</td>
    </tr>
    <tr>
    <td>In Progress</td>
    <td>PM ตัดสินใจไม่แก้</td>
    <td>Won&#39;t Fix</td>
    </tr>
    <tr>
    <td>Fixed</td>
    <td>QA เทสต์ผ่าน</td>
    <td>Verified</td>
    </tr>
    <tr>
    <td>Fixed</td>
    <td>QA เทสต์ไม่ผ่าน</td>
    <td>Reopened</td>
    </tr>
    <tr>
    <td>Reopened</td>
    <td>Dev เริ่มทำอีกครั้ง</td>
    <td>In Progress</td>
    </tr>
    <tr>
    <td>Verified</td>
    <td>PM ปิด</td>
    <td>Closed</td>
    </tr>
    </tbody></table></div>

  • ระบุ invalid transitions อย่างน้อย 4 ข้อที่ต้องเทสต์

    ดูคำตอบแนะนำ
    • Closed → In Progress: bug ที่ปิดแล้วไม่ควรกลับมา In Progress ได้โดยตรง (ต้อง reopen ก่อน ถ้ามี flow นั้น)
    • Open → Fixed: ไม่ควรกระโดดข้าม In Progress ได้
    • Won't Fix → In Progress: ถ้าตัดสินใจไม่แก้แล้ว ไม่ควรเริ่มทำได้
    • Verified → Reopened: ถ้า verify ผ่านแล้ว ไม่ควร reopen ได้ (ต้องผ่าน PM ก่อน)
    • Fixed → Open: ไม่ควรกลับไป Open ตรง ๆ
    • Closed → Fixed: ไม่ควรเปลี่ยนเป็น Fixed จาก Closed
  • เขียน test case สำหรับ happy path ที่ครบวงจร (จาก Open ถึง Closed)

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

    TC-ST-001: Bug lifecycle — happy path

    • Preconditions: มี bug ที่เพิ่งสร้างใหม่ สถานะ "Open"
    • Steps:
      1. ยืนยันว่า bug อยู่สถานะ "Open"
      2. Dev กดรับงาน → ตรวจสอบว่าสถานะเปลี่ยนเป็น "In Progress"
      3. Dev กด "แก้เสร็จ" → ตรวจสอบว่าสถานะเปลี่ยนเป็น "Fixed"
      4. QA เทสต์แล้วกด "ผ่าน" → ตรวจสอบว่าสถานะเปลี่ยนเป็น "Verified"
      5. PM กด "ปิด" → ตรวจสอบว่าสถานะเปลี่ยนเป็น "Closed"
    • Expected Result: Bug ผ่านครบทุกสถานะตามลำดับ: Open → In Progress → Fixed → Verified → Closed
    • Priority: High | Severity: Critical
  • สิ่งที่ต้องเอาติดตัวไปจากบทนี้

    • State Transition Testing เหมาะกับระบบที่พฤติกรรมเปลี่ยนตาม สถานะปัจจุบัน
    • มี 4 องค์ประกอบ: States, Transitions, Events, Guards
    • State Diagram ช่วยให้เห็น flow ทั้งหมดเป็นภาพ
    • State Transition Table จัดข้อมูลเป็นตาราง — แต่ละแถว = 1 test case
    • Invalid transitions ต้องเทสต์เสมอ — เพราะเป็นช่องทางที่บั๊กและ security issues ซ่อนอยู่
    • ใช้ได้กับ order flows, user accounts, workflows, และทุกระบบที่มี "สถานะ"