เทคนิค Equivalence Partitioning
เทสต์ทุกค่าที่เป็นไปได้? เป็นไปไม่ได้ แต่เราไม่จำเป็นต้องทำ — Equivalence Partitioning ช่วยให้คุณเทสต์น้อยลงแต่ครอบคลุมมากขึ้น
จบบทนี้แล้วคุณจะ...
- อธิบายหลักการ Equivalence Partitioning (EP) ได้
- แบ่ง input เป็น valid และ invalid partitions ได้
- ลดจำนวน test cases โดยไม่สูญเสีย coverage
- นำ EP ไปใช้กับ input fields ในชีวิตจริงได้
คุณไม่สามารถเทสต์ทุกค่าได้
สมมติว่าระบบรับอายุผู้ใช้ตั้งแต่ 18-60 ปี คุณจะเทสต์ค่าไหนบ้าง?
ถ้าเทสต์ทุกค่า: 18, 19, 20, 21, ... , 58, 59, 60 = 43 ค่า แค่ valid ยังไม่นับ invalid ที่น้อยกว่า 18 และมากกว่า 60 ซึ่งมีได้อนันต์
Equivalence Partitioning บอกว่า: "ค่าที่อยู่ใน 'กลุ่มเดียวกัน' จะให้ผลลัพธ์เหมือนกัน — เทสต์แค่ตัวแทนของแต่ละกลุ่มก็พอ"
ถ้าอายุ 25 ผ่าน → อายุ 30, 35, 42 ก็ควรผ่านเหมือนกัน เพราะมันอยู่ใน "กลุ่ม" เดียวกัน (valid range 18-60) ไม่จำเป็นต้องเทสต์ทุกค่า
แบ่งโลกของ Input ออกเป็นกลุ่มๆ
EP แบ่ง input ออกเป็น "กลุ่ม" (partitions/classes) ที่ค่าทุกตัวภายในกลุ่มเดียวกันถูก "ปฏิบัติเหมือนกัน" โดยระบบ
สำหรับช่องอายุ (18-60):
- Valid Partition: 18-60 → เลือกตัวแทน: 35
- Invalid Partition 1: น้อยกว่า 18 (เช่น -5, 0, 10, 17) → เลือกตัวแทน: 10
- Invalid Partition 2: มากกว่า 60 (เช่น 61, 75, 100, 999) → เลือกตัวแทน: 75
จาก input ที่เป็นไปได้นับพันค่า เหลือแค่ 3 ค่าที่ต้องเทสต์!
กฎของ EP:
- ทุก input ต้องอยู่ใน partition ใด partition หนึ่ง (ไม่มีค่าที่ตกหล่น)
- แต่ละค่าอยู่ได้แค่ partition เดียว (ไม่ซ้อนกัน)
- ถ้าค่าหนึ่งในกลุ่มผ่าน → ค่าทั้งหมดในกลุ่มควรผ่าน
- ถ้าค่าหนึ่งในกลุ่ม fail → ค่าทั้งหมดในกลุ่มควร fail
แบ่ง Partitions สำหรับ Input ที่ซับซ้อนขึ้น
Requirement: "ส่วนลดตามราคาสั่งซื้อ:
- ต่ำกว่า 500 บาท: ไม่มีส่วนลด
- 500-999 บาท: ลด 5%
- 1,000-4,999 บาท: ลด 10%
- 5,000 บาทขึ้นไป: ลด 15%"
| Partition | ช่วง | ส่วนลด | ค่าตัวแทน |
|---|---|---|---|
| Invalid (ติดลบ) | < 0 | Error | -100 |
| Valid 1 | 0-499 | 0% | 250 |
| Valid 2 | 500-999 | 5% | 750 |
| Valid 3 | 1,000-4,999 | 10% | 2,500 |
| Valid 4 | 5,000+ | 15% | 7,000 |
| Invalid (ไม่ใช่ตัวเลข) | ตัวอักษร, สัญลักษณ์ | Error | "abc" |
จาก input ที่เป็นไปได้อนันต์ เหลือแค่ 6 ค่าที่ต้องเทสต์ แต่ครอบคลุมทุกกรณีที่ "แตกต่างกัน"
ใช้ได้กับ dropdown, radio button, text input ด้วย
ตัวอย่าง 1: Dropdown เลือกจังหวัด
- Valid Partition: จังหวัดใดจังหวัดหนึ่ง (เช่น "กรุงเทพมหานคร")
- Invalid Partition: ไม่เลือก (ค่าว่าง)
ตัวอย่าง 2: Email field
- Valid Partition 1: email รูปแบบถูกต้อง ([email protected])
- Invalid Partition 1: ไม่มี @ (userdomain.com)
- Invalid Partition 2: ไม่มี domain (user@)
- Invalid Partition 3: ค่าว่าง ("")
- Invalid Partition 4: มี space (user @domain.com)
ตัวอย่าง 3: สถานะการจัดส่ง (radio button)
- Valid Partition 1: "จัดส่งปกติ"
- Valid Partition 2: "จัดส่งด่วน"
- Valid Partition 3: "รับเอง"
- Invalid Partition: ไม่เลือก (ถ้าบังคับเลือก)
สิ่งที่ EP ทำไม่ได้
EP เก่งในการลดจำนวน test case แต่มีจุดอ่อน:
ไม่ครอบคลุม boundary: EP เลือก "ตัวแทน" จากตรงกลางกลุ่ม แต่บั๊กส่วนใหญ่ซ่อนอยู่ที่ "ขอบ" ของกลุ่ม — นี่คือเหตุผลที่ต้องใช้ Boundary Value Analysis (BVA) ร่วมด้วย (จะเรียนในบทถัดไป)
สมมติว่าค่าในกลุ่มเดียวกันถูกปฏิบัติเหมือนกัน: ถ้า code มีเงื่อนไขพิเศษสำหรับค่าบางค่าในกลุ่ม EP จะตรวจไม่เจอ
ไม่ครอบคลุม combination ของ input หลายช่อง: EP มองทีละ input field — ถ้าบั๊กเกิดจากการ combine input 2 ช่องขึ้นไป ต้องใช้เทคนิคอื่น
แบบฝึก: แบ่ง Equivalence Classes จาก Input Field Specifications
ช่อง "จำนวนสินค้า" รับค่า 1-99 จงแบ่ง equivalence partitions
ดูคำตอบแนะนำ
- Invalid Partition 1: ค่าน้อยกว่า 1 (เช่น 0, -1, -99) → Expected: Error "จำนวนต้องอยู่ระหว่าง 1-99"
- Valid Partition: 1-99 (เช่น 50) → Expected: ระบบรับค่า คำนวณราคาถูกต้อง
- Invalid Partition 2: ค่ามากกว่า 99 (เช่น 100, 500, 9999) → Expected: Error
- Invalid Partition 3: ค่าที่ไม่ใช่ตัวเลข (เช่น "abc", "!@#") → Expected: Error
- Invalid Partition 4: ค่าทศนิยม (เช่น 1.5, 2.7) → Expected: Error (จำนวนสินค้าต้องเป็นจำนวนเต็ม)
- Invalid Partition 5: ค่าว่าง ("") → Expected: Error "กรุณากรอกจำนวน"
ช่อง "รหัสไปรษณีย์" (ประเทศไทย) ต้องเป็นตัวเลข 5 หลัก จงแบ่ง equivalence partitions
ดูคำตอบแนะนำ
- Valid Partition: ตัวเลข 5 หลัก (เช่น "10110", "50200") → Expected: ระบบรับค่า
- Invalid Partition 1: ตัวเลขน้อยกว่า 5 หลัก (เช่น "1011", "50") → Expected: Error "รหัสไปรษณีย์ต้อง 5 หลัก"
- Invalid Partition 2: ตัวเลขมากกว่า 5 หลัก (เช่น "101100", "5020001") → Expected: Error
- Invalid Partition 3: มีตัวอักษรปน (เช่น "1011A", "abcde") → Expected: Error "กรอกเฉพาะตัวเลข"
- Invalid Partition 4: ค่าว่าง ("") → Expected: Error "กรุณากรอกรหัสไปรษณีย์"
- Invalid Partition 5: มี space หรือขีด (เช่น "101 10", "101-10") → Expected: Error
ช่อง "วันเกิด" สำหรับสมัครบัตรเครดิต (ต้องอายุ 20-65 ปี) จงแบ่ง equivalence partitions โดยคิดจากอายุ
ดูคำตอบแนะนำ
- Invalid Partition 1: อายุน้อยกว่า 20 (เช่น เกิดปี 2010 → อายุ 16) → Expected: "อายุไม่ถึงเกณฑ์"
- Valid Partition: อายุ 20-65 (เช่น เกิดปี 1985 → อายุ 41) → Expected: ผ่านเงื่อนไขอายุ
- Invalid Partition 2: อายุมากกว่า 65 (เช่น เกิดปี 1950 → อายุ 76) → Expected: "อายุเกินเกณฑ์"
- Invalid Partition 3: วันที่ไม่มีจริง (เช่น 30 กุมภาพันธ์) → Expected: Error "วันที่ไม่ถูกต้อง"
- Invalid Partition 4: วันที่ในอนาคต → Expected: Error "วันเกิดต้องไม่เกินวันนี้"
- Invalid Partition 5: ค่าว่าง → Expected: Error "กรุณากรอกวันเกิด"
สิ่งที่ต้องเอาติดตัวไปจากบทนี้
- Equivalence Partitioning แบ่ง input ออกเป็นกลุ่ม — เทสต์แค่ตัวแทนของแต่ละกลุ่มก็พอ
- แบ่งเป็น valid partitions (ค่าที่ระบบรับ) และ invalid partitions (ค่าที่ระบบปฏิเสธ)
- EP ลดจำนวน test case ได้มาก โดยไม่สูญเสีย coverage ที่มีความหมาย
- EP มีจุดอ่อนเรื่อง boundary — ต้องใช้ร่วมกับ Boundary Value Analysis (บทถัดไป)
- ใช้ได้กับทุกประเภท input: ตัวเลข, ข้อความ, dropdown, radio button