State Transition Testing
หลายระบบไม่ได้ตอบสนองแค่ตาม input — มันตอบสนองตาม 'สถานะปัจจุบัน' ด้วย และ State Transition Testing คือเทคนิคที่จัดการกับสิ่งนี้
จบบทนี้แล้วคุณจะ...
- อธิบายได้ว่า State Transition Testing คืออะไร
- วาด state diagram จาก requirement ได้
- สร้าง state transition table ได้
- ระบุ invalid transitions ที่ต้องเทสต์ได้
พฤติกรรมเปลี่ยนตาม "สถานะ"
ลองนึกถึงตู้ 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 ถูกออกแบบมาเพื่อเรื่องนี้โดยเฉพาะ
4 สิ่งที่ต้องรู้จัก
States (สถานะ): สถานะที่ระบบอยู่ ณ เวลาหนึ่ง
- เช่น: "รอชำระเงิน", "ชำระแล้ว", "กำลังจัดส่ง"
Transitions (การเปลี่ยนสถานะ): การย้ายจากสถานะหนึ่งไปอีกสถานะ
- เช่น: "รอชำระเงิน" → "ชำระแล้ว"
Events (เหตุการณ์): สิ่งที่ทำให้เกิด transition
- เช่น: "ลูกค้ากดชำระเงิน" ทำให้เปลี่ยนจาก "รอชำระ" เป็น "ชำระแล้ว"
Guards/Conditions (เงื่อนไข): เงื่อนไขที่ต้องเป็นจริงเพื่อให้ transition เกิดขึ้น
- เช่น: "ชำระเงินสำเร็จ" (ถ้าไม่สำเร็จ จะไม่เปลี่ยนสถานะ)
วาดภาพให้เห็น 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: ยืนยัน, ชำระเงิน, ยกเลิก, จัดส่ง, ขอคืนเงิน, ได้รับ, สูญหาย, ขอคืนสินค้า, อนุมัติ, ปฏิเสธ
จัดข้อมูลเป็นตาราง
| สถานะปัจจุบัน | 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
สิ่งที่ "ไม่ควรเกิดขึ้น" แต่ต้องเทสต์
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 หรือบั๊กจะใช้ทำให้ระบบอยู่ใน "สถานะที่เป็นไปไม่ได้"
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
แบบฝึก: สร้าง 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"
ระบุ states ทั้งหมดในระบบ
ดูคำตอบแนะนำ
States ทั้งหมด 7 สถานะ:
- Open — เพิ่งสร้าง ยังไม่มีคนรับ
- In Progress — Dev กำลังแก้
- Fixed — Dev แก้เสร็จแล้ว รอ QA เทสต์
- Verified — QA เทสต์ผ่าน
- Reopened — QA เทสต์ไม่ผ่าน ส่งกลับ
- Closed — PM ปิด
- 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'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'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:
- ยืนยันว่า bug อยู่สถานะ "Open"
- Dev กดรับงาน → ตรวจสอบว่าสถานะเปลี่ยนเป็น "In Progress"
- Dev กด "แก้เสร็จ" → ตรวจสอบว่าสถานะเปลี่ยนเป็น "Fixed"
- QA เทสต์แล้วกด "ผ่าน" → ตรวจสอบว่าสถานะเปลี่ยนเป็น "Verified"
- 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, และทุกระบบที่มี "สถานะ"