Decision Table Testing
เมื่อ business rules ซับซ้อนเกินกว่าจะจำได้ — Decision Table ช่วยให้คุณเห็นทุก combination ของเงื่อนไขและผลลัพธ์อย่างเป็นระบบ
จบบทนี้แล้วคุณจะ...
- อธิบายได้ว่า Decision Table Testing คืออะไรและใช้เมื่อไร
- สร้าง decision table จาก business rules ได้
- ลดจำนวน rules ด้วยการ collapse rules ที่ซ้ำกัน
- นำ decision table ไปแปลงเป็น test cases ได้
ปัญหาของ "หลาย input ที่มีผลต่อกัน"
EP และ BVA เก่งมากเมื่อมองทีละ input field แต่ในชีวิตจริง ผลลัพธ์ของระบบมักขึ้นอยู่กับ "การผสมกัน" ของหลายเงื่อนไข
ตัวอย่าง: ระบบอนุมัติสินเชื่อ
- ถ้ารายได้สูงกว่า 30,000 และ ไม่มีหนี้ค้าง → อนุมัติ
- ถ้ารายได้สูงกว่า 30,000 แต่ มีหนี้ค้าง → อนุมัติแบบมีเงื่อนไข
- ถ้ารายได้ต่ำกว่า 30,000 และ ไม่มีหนี้ค้าง → ส่งให้ผู้จัดการพิจารณา
- ถ้ารายได้ต่ำกว่า 30,000 และ มีหนี้ค้าง → ปฏิเสธ
มี 2 เงื่อนไข (รายได้, หนี้) ที่ "ผสมกัน" ให้ผลลัพธ์ต่างกัน 4 แบบ — ถ้ามี 3-4 เงื่อนไข จะซับซ้อนขึ้นอีกมาก EP + BVA ไม่ช่วยเรื่อง combination
ตารางที่แสดง "ทุก combination" ของเงื่อนไขและผลลัพธ์
Decision Table มี 4 ส่วน:
| Rule 1 | Rule 2 | Rule 3 | Rule 4 | |
|---|---|---|---|---|
| Conditions | ||||
| รายได้ > 30,000 | Y | Y | N | N |
| ไม่มีหนี้ค้าง | Y | N | Y | N |
| Actions | ||||
| ผลลัพธ์ | อนุมัติ | อนุมัติมีเงื่อนไข | ส่งผู้จัดการ | ปฏิเสธ |
Conditions: เงื่อนไขที่กำหนดผลลัพธ์ (input) Actions: ผลลัพธ์ที่เกิดขึ้น (output) Rules: แต่ละ column คือ 1 combination ของเงื่อนไข
จำนวน rules = 2^n (เมื่อ n = จำนวนเงื่อนไขที่เป็น Y/N)
- 2 เงื่อนไข = 4 rules
- 3 เงื่อนไข = 8 rules
- 4 เงื่อนไข = 16 rules
ตัวอย่าง: ระบบส่วนลดร้านค้า
Business Rules:
- สมาชิก VIP ที่ซื้อครบ 1,000 บาท → ลด 20%
- สมาชิก VIP ที่ซื้อไม่ครบ 1,000 บาท → ลด 10%
- สมาชิกทั่วไปที่ซื้อครบ 1,000 บาท → ลด 5%
- สมาชิกทั่วไปที่ซื้อไม่ครบ 1,000 บาท → ไม่มีส่วนลด
- ลูกค้าที่ไม่ได้เป็นสมาชิก → ไม่มีส่วนลดในทุกกรณี
ขั้นตอนที่ 1: ระบุ Conditions
- C1: เป็นสมาชิกหรือไม่?
- C2: เป็น VIP หรือไม่? (ถ้าเป็นสมาชิก)
- C3: ซื้อครบ 1,000 บาทหรือไม่?
ขั้นตอนที่ 2: ระบุ Actions
- A1: ลด 20%
- A2: ลด 10%
- A3: ลด 5%
- A4: ไม่มีส่วนลด
ขั้นตอนที่ 3: สร้างตาราง
| R1 | R2 | R3 | R4 | R5 | R6 | |
|---|---|---|---|---|---|---|
| C1: เป็นสมาชิก | Y | Y | Y | Y | N | N |
| C2: เป็น VIP | Y | Y | N | N | - | - |
| C3: ซื้อครบ 1,000 | Y | N | Y | N | Y | N |
| Actions | ||||||
| ส่วนลด | 20% | 10% | 5% | 0% | 0% | 0% |
ขีด "-" หมายความว่า เงื่อนไขนั้นไม่มีผลต่อ action (เพราะไม่ได้เป็นสมาชิก จะ VIP หรือไม่ก็ไม่มีผล)
ลดความซ้ำซ้อน
จาก decision table ด้านบน R5 และ R6 ให้ผลลัพธ์เหมือนกัน (ไม่มีส่วนลด) ไม่ว่าจะซื้อครบ 1,000 หรือไม่ก็ตาม เราสามารถ "collapse" (ยุบรวม) ได้:
| R1 | R2 | R3 | R4 | R5 | |
|---|---|---|---|---|---|
| C1: เป็นสมาชิก | Y | Y | Y | Y | N |
| C2: เป็น VIP | Y | Y | N | N | - |
| C3: ซื้อครบ 1,000 | Y | N | Y | N | - |
| ส่วนลด | 20% | 10% | 5% | 0% | 0% |
จาก 6 rules เหลือ 5 rules — ในระบบจริงที่มีเงื่อนไขเยอะ การ collapse ช่วยลดจำนวน test cases ได้มาก
กฎ: ถ้า 2 rules ต่างกันแค่ 1 condition แต่ให้ action เหมือนกัน → collapse ได้ (ใส่ "-" ที่ condition นั้น)
แต่ละ Rule = 1 Test Case (อย่างน้อย)
| Rule | Test Case | Input | Expected |
|---|---|---|---|
| R1 | TC-DT-001 | สมาชิก VIP, ซื้อ 1,500 บาท | ลด 20% → จ่าย 1,200 บาท |
| R2 | TC-DT-002 | สมาชิก VIP, ซื้อ 800 บาท | ลด 10% → จ่าย 720 บาท |
| R3 | TC-DT-003 | สมาชิกทั่วไป, ซื้อ 1,200 บาท | ลด 5% → จ่าย 1,140 บาท |
| R4 | TC-DT-004 | สมาชิกทั่วไป, ซื้อ 500 บาท | ไม่ลด → จ่าย 500 บาท |
| R5 | TC-DT-005 | ไม่เป็นสมาชิก, ซื้อ 2,000 บาท | ไม่ลด → จ่าย 2,000 บาท |
สังเกตว่า decision table ทำให้เราเห็นชัดว่าต้องเทสต์ "combination" ไหนบ้าง — ไม่มีอะไรตกหล่น
แบบฝึก: สร้าง Decision Table จาก Discount Policy
Business Rules สำหรับระบบจัดส่ง:
- สินค้าราคา >= 2,000 บาท และ เป็นสมาชิก → ส่งฟรี
- สินค้าราคา >= 2,000 บาท แต่ ไม่เป็นสมาชิก → ค่าส่ง 50 บาท
- สินค้าราคา < 2,000 บาท และ เป็นสมาชิก → ค่าส่ง 30 บาท
- สินค้าราคา < 2,000 บาท และ ไม่เป็นสมาชิก → ค่าส่ง 80 บาท
- น้ำหนักเกิน 20 kg จะมีค่าส่งเพิ่ม 100 บาท ในทุกกรณี (ยกเว้นส่งฟรี → ค่าส่ง 100 บาท)
ระบุ conditions และ actions ทั้งหมด
ดูคำตอบแนะนำ
Conditions:
- C1: สินค้าราคา >= 2,000 บาท? (Y/N)
- C2: เป็นสมาชิก? (Y/N)
- C3: น้ำหนักเกิน 20 kg? (Y/N)
Actions:
- ค่าจัดส่ง: ฟรี, 30 บาท, 50 บาท, 80 บาท
- ค่าน้ำหนักเพิ่ม: 0 หรือ 100 บาท
สร้าง decision table ที่สมบูรณ์
ดูคำตอบแนะนำ
R1 R2 R3 R4 R5 R6 R7 R8 C1: ราคา >= 2,000 Y Y Y Y N N N N C2: เป็นสมาชิก Y Y N N Y Y N N C3: น้ำหนัก > 20kg Y N Y N Y N Y N ค่าส่ง 100 0 150 50 130 30 180 80 คำอธิบาย:
- R1: ส่งฟรี + น้ำหนักเกิน = 0 + 100 = 100 บาท
- R2: ส่งฟรี + น้ำหนักปกติ = 0 บาท
- R3: 50 + 100 = 150 บาท
- R4: 50 + 0 = 50 บาท
- R5: 30 + 100 = 130 บาท
- R6: 30 + 0 = 30 บาท
- R7: 80 + 100 = 180 บาท
- R8: 80 + 0 = 80 บาท
มี rules ไหนที่ collapse ได้ไหม? อธิบาย
ดูคำตอบแนะนำ
ในกรณีนี้ ไม่สามารถ collapse ได้ เพราะทุก rule ให้ค่าจัดส่งต่างกัน ไม่มี 2 rules ที่ต่างกันแค่ 1 condition แล้วให้ผลลัพธ์เหมือนกัน
ถ้า business rule เปลี่ยนเป็น "น้ำหนักเกิน 20 kg เสียค่าเพิ่ม 100 บาทเหมือนกันทุกกรณี ไม่ยกเว้น" → R1 จะกลายเป็น 100 บาทเหมือนเดิม ก็ยังไม่ collapse ได้
การ collapse ได้หรือไม่ขึ้นอยู่กับ business rules — ไม่ใช่ทุก table จะ collapse ได้
สิ่งที่ต้องเอาติดตัวไปจากบทนี้
- Decision Table เหมาะกับ business rules ที่มี หลายเงื่อนไขผสมกัน
- ตารางมี 4 ส่วน: Conditions, Actions, Rules (combinations), และ "-" (don't care)
- จำนวน rules = 2^n เมื่อ n = จำนวนเงื่อนไข Y/N
- Collapse rules เพื่อลดจำนวน test cases — ถ้า 2 rules ต่างกันแค่ 1 condition แต่ action เหมือนกัน
- แต่ละ rule แปลงเป็น อย่างน้อย 1 test case — ไม่มี combination ที่ตกหล่น