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

เทคนิค Boundary Value Analysis

บั๊กส่วนใหญ่ไม่ได้ซ่อนอยู่ตรงกลาง — มันชอบซ่อนอยู่ที่ 'ขอบ' ของเงื่อนไข และ Boundary Value Analysis คือเทคนิคที่ไล่จับมัน

เวลาเรียน: 15–20 นาที ต้องรู้มาก่อน: Lesson 05 - Equivalence Partitioning รูปแบบ: อ่าน + แบบฝึกสั้นๆ

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

  • อธิบายหลักการ Boundary Value Analysis (BVA) ได้
  • ระบุ boundary values จาก specification ได้
  • เข้าใจ off-by-one errors และทำไม boundaries ถึงสำคัญ
  • ใช้ EP ร่วมกับ BVA เพื่อออกแบบ test cases ที่ครอบคลุม
1 · ทำไมต้องเทสต์ที่ขอบ?

Off-by-One: บั๊กยอดฮิตของโปรแกรมเมอร์

Requirement: "ผู้ใช้อายุ 18-60 ปีสามารถสมัครได้"

โปรแกรมเมอร์เขียน code:

if (age > 18 && age < 60) { // อนุญาต }

สังเกตไหม? เขาใช้ > แทน >= และ < แทน <= ทำให้:

  • อายุ 18 → ไม่ผ่าน (ทั้งที่ควรผ่าน)
  • อายุ 60 → ไม่ผ่าน (ทั้งที่ควรผ่าน)
  • อายุ 19-59 → ผ่าน

ถ้าคุณเทสต์แค่ค่ากลาง (เช่น 35) จะไม่มีทางเจอบั๊กนี้ แต่ถ้าเทสต์ค่า 18 หรือ 60 จะเจอทันที!

นี่คือ off-by-one error — บั๊กที่เกิดจากการเขียนเงื่อนไขผิดไป 1 ค่า และเป็นบั๊กที่พบบ่อยที่สุดในโปรแกรมจริง

2 · หลักการ BVA

เทสต์ที่ "ขอบ" ของแต่ละ 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 มากขึ้น
3 · EP + BVA: คู่หูที่ต้องใช้ด้วยกัน

ตัวอย่าง: ระบบส่วนลด

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 ที่เป็นไปได้อนันต์

4 · BVA กับ 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 รายการ → ต้องไม่เกิดขึ้น (ถ้าเกิดขึ้นคือบั๊ก)
5 · เรื่องเล่า: ที่มาของ "ข้อผิดพลาดที่ขอบ" ในชีวิตจริง

ระบบจองห้องพักที่รับ 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%) จะช่วยเจอ

Practice

แบบฝึก: หา Boundary Values จาก Specifications

  1. ช่อง "รหัสผ่าน" กำหนดว่าต้องยาว 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. ระบบคำนวณค่าจัดส่ง: น้ำหนักไม่เกิน 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 ค่าที่ต้องเทสต์

  3. ฟอร์มจอง "จำนวนผู้เข้าพัก" กำหนด 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 คือเทคนิคที่จับมันได้ดีที่สุด