CupCode.cc
Section 02 · Module 03 · Lesson 01 · ~15–20 นาที

เทคนิค Equivalence Partitioning

เทสต์ทุกค่าที่เป็นไปได้? เป็นไปไม่ได้ แต่เราไม่จำเป็นต้องทำ — Equivalence Partitioning ช่วยให้คุณเทสต์น้อยลงแต่ครอบคลุมมากขึ้น

เวลาเรียน: 15–20 นาที ต้องรู้มาก่อน: Module 02 ทั้งหมด รูปแบบ: อ่าน + แบบฝึกสั้นๆ

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

  • อธิบายหลักการ Equivalence Partitioning (EP) ได้
  • แบ่ง input เป็น valid และ invalid partitions ได้
  • ลดจำนวน test cases โดยไม่สูญเสีย coverage
  • นำ EP ไปใช้กับ input fields ในชีวิตจริงได้
1 · ปัญหาที่ EP แก้

คุณไม่สามารถเทสต์ทุกค่าได้

สมมติว่าระบบรับอายุผู้ใช้ตั้งแต่ 18-60 ปี คุณจะเทสต์ค่าไหนบ้าง?

ถ้าเทสต์ทุกค่า: 18, 19, 20, 21, ... , 58, 59, 60 = 43 ค่า แค่ valid ยังไม่นับ invalid ที่น้อยกว่า 18 และมากกว่า 60 ซึ่งมีได้อนันต์

Equivalence Partitioning บอกว่า: "ค่าที่อยู่ใน 'กลุ่มเดียวกัน' จะให้ผลลัพธ์เหมือนกัน — เทสต์แค่ตัวแทนของแต่ละกลุ่มก็พอ"

ถ้าอายุ 25 ผ่าน → อายุ 30, 35, 42 ก็ควรผ่านเหมือนกัน เพราะมันอยู่ใน "กลุ่ม" เดียวกัน (valid range 18-60) ไม่จำเป็นต้องเทสต์ทุกค่า

2 · หลักการของ Equivalence Partitioning

แบ่งโลกของ 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:

  1. ทุก input ต้องอยู่ใน partition ใด partition หนึ่ง (ไม่มีค่าที่ตกหล่น)
  2. แต่ละค่าอยู่ได้แค่ partition เดียว (ไม่ซ้อนกัน)
  3. ถ้าค่าหนึ่งในกลุ่มผ่าน → ค่าทั้งหมดในกลุ่มควรผ่าน
  4. ถ้าค่าหนึ่งในกลุ่ม fail → ค่าทั้งหมดในกลุ่มควร fail
3 · ตัวอย่างจริง: ราคาสินค้า

แบ่ง 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 ค่าที่ต้องเทสต์ แต่ครอบคลุมทุกกรณีที่ "แตกต่างกัน"

4 · EP กับ Input ที่ไม่ใช่ตัวเลข

ใช้ได้กับ 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: ไม่เลือก (ถ้าบังคับเลือก)
5 · ข้อจำกัดของ EP

สิ่งที่ EP ทำไม่ได้

EP เก่งในการลดจำนวน test case แต่มีจุดอ่อน:

  1. ไม่ครอบคลุม boundary: EP เลือก "ตัวแทน" จากตรงกลางกลุ่ม แต่บั๊กส่วนใหญ่ซ่อนอยู่ที่ "ขอบ" ของกลุ่ม — นี่คือเหตุผลที่ต้องใช้ Boundary Value Analysis (BVA) ร่วมด้วย (จะเรียนในบทถัดไป)

  2. สมมติว่าค่าในกลุ่มเดียวกันถูกปฏิบัติเหมือนกัน: ถ้า code มีเงื่อนไขพิเศษสำหรับค่าบางค่าในกลุ่ม EP จะตรวจไม่เจอ

  3. ไม่ครอบคลุม combination ของ input หลายช่อง: EP มองทีละ input field — ถ้าบั๊กเกิดจากการ combine input 2 ช่องขึ้นไป ต้องใช้เทคนิคอื่น

Practice

แบบฝึก: แบ่ง Equivalence Classes จาก Input Field Specifications

  1. ช่อง "จำนวนสินค้า" รับค่า 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 "กรุณากรอกจำนวน"
  2. ช่อง "รหัสไปรษณีย์" (ประเทศไทย) ต้องเป็นตัวเลข 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
  3. ช่อง "วันเกิด" สำหรับสมัครบัตรเครดิต (ต้องอายุ 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