เทคนิค Boundary Value Analysis
บั๊กส่วนใหญ่ไม่ได้ซ่อนอยู่ตรงกลาง — มันชอบซ่อนอยู่ที่ 'ขอบ' ของเงื่อนไข และ Boundary Value Analysis คือเทคนิคที่ไล่จับมัน
จบบทนี้แล้วคุณจะ...
- อธิบายหลักการ Boundary Value Analysis (BVA) ได้
- ระบุ boundary values จาก specification ได้
- เข้าใจ off-by-one errors และทำไม boundaries ถึงสำคัญ
- ใช้ EP ร่วมกับ BVA เพื่อออกแบบ test cases ที่ครอบคลุม
Off-by-One: บั๊กยอดฮิตของโปรแกรมเมอร์
Requirement: "ผู้ใช้อายุ 18-60 ปีสามารถสมัครได้"
โปรแกรมเมอร์เขียน code:
if (age > 18 && age < 60) { // อนุญาต }
สังเกตไหม? เขาใช้ > แทน >= และ < แทน <= ทำให้:
- อายุ 18 → ไม่ผ่าน (ทั้งที่ควรผ่าน)
- อายุ 60 → ไม่ผ่าน (ทั้งที่ควรผ่าน)
- อายุ 19-59 → ผ่าน
ถ้าคุณเทสต์แค่ค่ากลาง (เช่น 35) จะไม่มีทางเจอบั๊กนี้ แต่ถ้าเทสต์ค่า 18 หรือ 60 จะเจอทันที!
นี่คือ off-by-one error — บั๊กที่เกิดจากการเขียนเงื่อนไขผิดไป 1 ค่า และเป็นบั๊กที่พบบ่อยที่สุดในโปรแกรมจริง
เทสต์ที่ "ขอบ" ของแต่ละ Partition
BVA เน้นเทสต์ค่าที่อยู่ตรง "ขอบ" (boundary) ของ equivalence partitions เพราะนั่นคือจุดที่โปรแกรมเปลี่ยนพฤติกรรม — และเป็นจุดที่บั๊กมักซ่อนอยู่
สำหรับ range 18-60:
2-value BVA (ค่าต่ำสุด): เทสต์แค่ค่า boundary ตรงๆ
- 17 (ต่ำกว่าขอบล่าง 1) → ไม่ผ่าน
- 18 (ขอบล่าง) → ผ่าน
- 60 (ขอบบน) → ผ่าน
- 61 (สูงกว่าขอบบน 1) → ไม่ผ่าน
3-value BVA (ละเอียดกว่า): เพิ่มค่า "ด้านใน" ของขอบ
- 17 → ไม่ผ่าน
- 18 → ผ่าน
- 19 → ผ่าน
- 59 → ผ่าน
- 60 → ผ่าน
- 61 → ไม่ผ่าน
| วิธี | จำนวนค่าที่เทสต์ | ใช้เมื่อ |
|---|---|---|
| 2-value BVA | 4 ค่า (17, 18, 60, 61) | ทั่วไป, เพียงพอสำหรับงานส่วนใหญ่ |
| 3-value BVA | 6 ค่า (17, 18, 19, 59, 60, 61) | ระบบที่มี risk สูง, ต้องการ coverage มากขึ้น |
ตัวอย่าง: ระบบส่วนลด
Requirement: "ส่วนลดตามยอดสั่งซื้อ:
- 0-499 บาท: ไม่ลด
- 500-999 บาท: ลด 5%
- 1,000-4,999 บาท: ลด 10%
- 5,000+ บาท: ลด 15%"
EP ให้ตัวแทนของแต่ละกลุ่ม: 250, 750, 2500, 7000
BVA เพิ่มค่าขอบ:
| Boundary | ค่าที่ต้องเทสต์ | Expected |
|---|---|---|
| ขอบ 499/500 | 499 → 0%, 500 → 5% | เปลี่ยนจาก 0% เป็น 5% |
| ขอบ 999/1000 | 999 → 5%, 1000 → 10% | เปลี่ยนจาก 5% เป็น 10% |
| ขอบ 4999/5000 | 4999 → 10%, 5000 → 15% | เปลี่ยนจาก 10% เป็น 15% |
รวมกัน: EP (4 ค่า) + BVA (6 ค่า) = 10 ค่า ที่ครอบคลุมทุกกลุ่มและทุกขอบ — น้อยมากเมื่อเทียบกับ input ที่เป็นไปได้อนันต์
ไม่ใช่แค่ตัวเลข
String length (ชื่อ 2-50 ตัวอักษร):
- 1 ตัว → ไม่ผ่าน (ต่ำกว่าขั้นต่ำ)
- 2 ตัว → ผ่าน (ขั้นต่ำ)
- 50 ตัว → ผ่าน (ขั้นสูงสุด)
- 51 ตัว → ไม่ผ่าน (เกินขั้นสูงสุด)
Date (วันที่ 1 ม.ค. - 31 ธ.ค.):
- 31 ธ.ค. ปีก่อน → ไม่ผ่าน
- 1 ม.ค. → ผ่าน
- 31 ธ.ค. → ผ่าน
- 1 ม.ค. ปีถัดไป → ไม่ผ่าน
File size (อัปโหลดไฟล์ ไม่เกิน 10MB):
- 9.99 MB → ผ่าน
- 10.00 MB → ผ่าน (ขอบบน)
- 10.01 MB → ไม่ผ่าน
- 0 KB (ไฟล์ว่าง) → ขึ้นอยู่กับ requirement
จำนวน items ในรายการ (ตะกร้าได้สูงสุด 20 รายการ):
- 19 รายการ → เพิ่มได้ 1 อีก
- 20 รายการ → เต็ม, ไม่ควรเพิ่มได้อีก
- 21 รายการ → ต้องไม่เกิดขึ้น (ถ้าเกิดขึ้นคือบั๊ก)
ระบบจองห้องพักที่รับ 0 คืน
โรงแรมแห่งหนึ่งมีระบบจองออนไลน์ที่กำหนดว่า "จองได้ 1-30 คืน" ทีมพัฒนาเทสต์ด้วยค่า 5, 10, 15 คืน ผ่านทุกเคส
แต่ไม่มีใครเทสต์ค่า 0 — ปรากฏว่าระบบยอมรับการจอง 0 คืน สร้าง booking สำเร็จ คิดเงิน 0 บาท และส่ง confirmation email ไปหาลูกค้า พอลูกค้ามาถึงโรงแรม จึงพบว่าไม่มีห้อง
ถ้าใช้ BVA จะเทสต์ค่า 0 (ต่ำกว่าขอบล่าง 1) ตั้งแต่แรก และเจอบั๊กนี้ก่อน production
อีกตัวอย่าง: ระบบ e-commerce ที่ใช้ coupon code กำหนดว่า "ส่วนลดสูงสุด 50%" แต่ไม่ได้เทสต์กรณีที่ลูกค้าใช้ coupon หลายใบรวมกันจนเกิน 50% — ได้สินค้าฟรี! นี่คือบั๊กที่ BVA ที่ขอบบน (50%) จะช่วยเจอ
แบบฝึก: หา Boundary Values จาก Specifications
ช่อง "รหัสผ่าน" กำหนดว่าต้องยาว 8-20 ตัวอักษร จงระบุ boundary values ที่ต้องเทสต์ (ใช้ 2-value BVA)
ดูคำตอบแนะนำ
- 7 ตัวอักษร (ต่ำกว่าขั้นต่ำ 1) → Expected: Error "รหัสผ่านต้องยาว 8-20 ตัวอักษร"
- 8 ตัวอักษร (ขั้นต่ำพอดี) → Expected: ระบบรับค่า
- 20 ตัวอักษร (ขั้นสูงสุดพอดี) → Expected: ระบบรับค่า
- 21 ตัวอักษร (เกินสูงสุด 1) → Expected: Error "รหัสผ่านต้องยาว 8-20 ตัวอักษร"
รวม 4 ค่าที่ต้องเทสต์
ระบบคำนวณค่าจัดส่ง: น้ำหนักไม่เกิน 2 kg = 50 บาท, 2.01-10 kg = 100 บาท, เกิน 10 kg = 200 บาท จงหา boundary values ทั้งหมด
ดูคำตอบแนะนำ
Boundary ที่ 2 kg:
- 2.00 kg → 50 บาท (ขอบบนของช่วงแรก)
- 2.01 kg → 100 บาท (ขอบล่างของช่วงที่สอง)
Boundary ที่ 10 kg:
- 10.00 kg → 100 บาท (ขอบบนของช่วงที่สอง)
- 10.01 kg → 200 บาท (ขอบล่างของช่วงที่สาม)
Boundary พิเศษ:
- 0 kg → ควรเป็น error (ไม่ควรจัดส่งของที่ไม่มีน้ำหนัก)
- ค่าติดลบ (-1 kg) → ควรเป็น error
รวม 6 ค่าที่ต้องเทสต์
ฟอร์มจอง "จำนวนผู้เข้าพัก" กำหนด 1-4 คน ถ้าเกิน 4 คนต้องโทรจอง จงออกแบบ test cases โดยใช้ทั้ง EP และ BVA
ดูคำตอบแนะนำ
EP Partitions:
- Invalid 1: < 1 (เช่น 0, -1) → Error
- Valid: 1-4 (ตัวแทน: 2) → จองได้
- Invalid 2: > 4 (เช่น 5, 10) → แสดงข้อความ "กรุณาโทรจอง"
BVA Values:
- 0 → Error "กรุณาระบุจำนวนผู้เข้าพัก" (ต่ำกว่าขอบล่าง)
- 1 → จองได้ (ขอบล่าง)
- 4 → จองได้ (ขอบบน)
- 5 → "กรุณาโทรจอง" (สูงกว่าขอบบน)
รวม test cases:
TC ค่า Source Expected TC-01 0 BVA ขอบล่าง Error TC-02 1 BVA ขอบล่าง จองได้ TC-03 2 EP ตัวแทน valid จองได้ TC-04 4 BVA ขอบบน จองได้ TC-05 5 BVA ขอบบน "กรุณาโทรจอง" TC-06 -1 EP invalid Error TC-07 "abc" EP invalid (ไม่ใช่ตัวเลข) Error
สิ่งที่ต้องเอาติดตัวไปจากบทนี้
- BVA เทสต์ค่าที่ "ขอบ" ของ partitions — จุดที่ off-by-one errors ชอบซ่อนตัว
- 2-value BVA เทสต์ค่าขอบ 2 ค่าต่อจุด (ด้านในกับด้านนอก) — เพียงพอสำหรับงานทั่วไป
- 3-value BVA เพิ่มค่า "ข้าง ๆ ขอบ" — ใช้กับระบบที่มี risk สูง
- EP + BVA คือคู่หู — EP ลดจำนวนกลุ่ม, BVA ตรวจจุดเปลี่ยนระหว่างกลุ่ม
- Off-by-one error เป็นบั๊กที่ พบบ่อยที่สุด และ BVA คือเทคนิคที่จับมันได้ดีที่สุด