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

ฝึกเขียน Test Case จริง

ทฤษฎีรู้แล้ว ถึงเวลาลงมือเขียน — เราจะฝึกเขียน test case ที่ชัดเจน ไม่คลุมเครือ และนำไปใช้ซ้ำได้

เวลาเรียน: 15–20 นาที ต้องรู้มาก่อน: Lesson 03 - โครงสร้างของ Test Case ที่ดี รูปแบบ: อ่าน + แบบฝึกสั้นๆ

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

  • เขียน test steps ที่ชัดเจน ไม่คลุมเครือ
  • หลีกเลี่ยงปัญหาที่พบบ่อยในการเขียน test case
  • ออกแบบ test case ที่นำไปใช้ซ้ำได้ (reusable)
  • เข้าใจเรื่อง test data และการเตรียมข้อมูลสำหรับทดสอบ
1 · ศิลปะของการเขียน Test Steps ที่ชัดเจน

กฎ 3 ข้อของ Steps ที่ดี

กฎข้อ 1: หนึ่ง Step = หนึ่ง Action

  • ผิด: "เปิดหน้า login แล้วกรอก email และ password แล้วกด submit"
  • ถูก:
    1. เปิดหน้า login
    2. กรอก email: [email protected]
    3. กรอก password: Test@1234
    4. กดปุ่ม "เข้าสู่ระบบ"

กฎข้อ 2: ระบุค่าที่แน่นอน ไม่ใช่คำคลุมเครือ

  • ผิด: "กรอก email ที่ถูกต้อง"
  • ถูก: "กรอก email: [email protected]"

กฎข้อ 3: ระบุ element ที่ต้องโต้ตอบให้ชัด

  • ผิด: "กดปุ่ม"
  • ถูก: "กดปุ่ม 'เข้าสู่ระบบ' ที่อยู่ด้านล่างฟอร์ม"
2 · ปัญหาที่พบบ่อยในการเขียน Test Case

5 ข้อผิดพลาดที่มือใหม่ทำเป็นประจำ

ข้อผิดพลาดที่ 1: Expected Result ที่คลุมเครือ

  • ผิด: "ระบบทำงานถูกต้อง"
  • ถูก: "ระบบแสดงหน้า dashboard พร้อม notification 'ยินดีต้อนรับ สมชาย' ที่มุมบนขวา"

ข้อผิดพลาดที่ 2: ลืม Preconditions

  • ผิด: เริ่มที่ "กดปุ่มแก้ไข profile" โดยไม่บอกว่าต้อง login ก่อน
  • ถูก: Preconditions: "ผู้ใช้ login ด้วย account: [email protected], อยู่ที่หน้า Profile Settings"

ข้อผิดพลาดที่ 3: สมมติว่าผู้อ่านรู้ระบบ

  • ผิด: "ไปหน้า settings แล้วเปิด toggle นั้น"
  • ถูก: "คลิก icon รูปเฟือง ที่ sidebar ซ้าย → เลือก 'Notification Settings' → เปิด toggle 'Email Notifications'"

ข้อผิดพลาดที่ 4: Test Data ไม่ realistic

  • ผิด: ใช้ email "[email protected]" ชื่อ "test test"
  • ถูก: ใช้ email "[email protected]" ชื่อ "สมชาย ใจดี" — ข้อมูลจริงช่วยเจอบั๊กเรื่อง encoding, ความยาว, ภาษา

ข้อผิดพลาดที่ 5: รวม positive และ negative ไว้ใน test case เดียว

  • ผิด: "กรอกข้อมูลถูกต้อง → สำเร็จ. กรอกผิด → error." (ใน TC เดียว)
  • ถูก: แยกเป็น TC-001 (positive) และ TC-002 (negative) — แต่ละ test case ต้องมีผลลัพธ์เดียวที่ชัดเจน
3 · Reusable Test Cases

เขียนครั้งเดียว ใช้ได้หลายรอบ

Test case ที่ดีควรออกแบบให้ "นำไปใช้ซ้ำได้" ไม่ว่าจะรันในสภาพแวดล้อมไหน:

หลักการ 1: แยก Test Data ออกจาก Test Steps แทนที่จะ hardcode ค่าในขั้นตอน ให้อ้างอิง test data แยกต่างหาก:

Steps:

  1. เปิดหน้า login
  2. กรอก email: [TEST_EMAIL]
  3. กรอก password: [TEST_PASSWORD]
  4. กดปุ่ม "เข้าสู่ระบบ"

Test Data Set 1: TEST_EMAIL = [email protected], TEST_PASSWORD = Admin@1234 Test Data Set 2: TEST_EMAIL = [email protected], TEST_PASSWORD = User@5678

หลักการ 2: ใช้ Shared Preconditions ถ้าหลาย test case มี precondition เหมือนกัน (เช่น "login แล้ว") ให้สร้าง "common setup" ที่อ้างอิงได้:

Precondition: [SETUP-LOGIN] (อ้างอิง setup procedure สำหรับ login)

หลักการ 3: ทำให้ test case เป็นอิสระจากกัน

  • ผิด: "TC-002 ต้องรัน TC-001 ก่อน"
  • ถูก: แต่ละ TC มี precondition ของตัวเอง สามารถรันในลำดับไหนก็ได้
4 · Test Data Considerations

ข้อมูลทดสอบที่ดีเจอบั๊กได้มากกว่า

Valid Data: ข้อมูลที่ถูกต้องตามเงื่อนไข

  • ชื่อ: "สมชาย ใจดี" (ภาษาไทย, มีเว้นวรรค)
  • email: "[email protected]" (มี subdomain)
  • เบอร์โทร: "0891234567" (10 หลัก, เริ่มด้วย 0)

Invalid Data: ข้อมูลที่ผิดเงื่อนไข

  • email: "user@" (ไม่มี domain)
  • เบอร์โทร: "12345" (สั้นเกินไป)
  • จำนวนสินค้า: "-1" (ค่าติดลบ)

Boundary Data: ข้อมูลที่อยู่ตรงขอบ

  • password ยาว 8 ตัว (ขั้นต่ำ), 7 ตัว (ต่ำกว่าขั้นต่ำ 1)
  • จำนวนสินค้า: 0, 1, 99, 100 (ถ้าสูงสุด 99)

Special Data: ข้อมูลพิเศษที่มักทำให้ระบบมีปัญหา

  • ชื่อที่มี apostrophe: "O'Brien"
  • text ที่มี HTML: ""
  • ค่าที่ยาวมาก: string 10,000 ตัวอักษร
  • emoji: "สมชาย 🎉"
5 · ตัวอย่างครบวงจร: Shopping Cart

จาก Requirement สู่ Test Case

Requirement: "ผู้ใช้สามารถปรับจำนวนสินค้าในตะกร้าได้ (1-99 ชิ้น) ราคารวมต้องคำนวณใหม่ทันที"

TC-CART-010: ปรับจำนวนสินค้าจาก 1 เป็น 3

  • Preconditions: ผู้ใช้ login แล้ว, มีสินค้า "เสื้อยืดสีดำ" ราคา 350 บาท อยู่ในตะกร้า จำนวน 1 ชิ้น
  • Steps:
    1. เปิดหน้าตะกร้าสินค้า
    2. ที่สินค้า "เสื้อยืดสีดำ" เปลี่ยนจำนวนจาก 1 เป็น 3
    3. สังเกตราคารวมของสินค้ารายการนี้
    4. สังเกตราคารวมทั้งหมดของตะกร้า
  • Expected Result: ราคารวมรายการ = 1,050 บาท (350 x 3), ราคารวมตะกร้า update ทันที
  • Priority: High | Severity: High
  • Traceability: REQ-CART-003
Practice

แบบฝึก: เขียน Test Case สำหรับ Shopping Cart Feature

Requirement: "ผู้ใช้สามารถลบสินค้าออกจากตะกร้าได้ เมื่อลบแล้วสินค้าหายจากรายการ ราคารวมคำนวณใหม่ ถ้าตะกร้าว่างให้แสดงข้อความ 'ตะกร้าของคุณว่างเปล่า'"

  1. เขียน test case สำหรับ happy path "ลบสินค้าสำเร็จ" โดยมีครบทุกองค์ประกอบ

    ดูคำตอบแนะนำ

    TC-CART-020: ลบสินค้าออกจากตะกร้าสำเร็จ

    • Preconditions: ผู้ใช้ login แล้ว, ตะกร้ามีสินค้า 2 รายการ: "เสื้อยืดสีดำ" (350 บาท x1) และ "กางเกงยีนส์" (890 บาท x1), ราคารวม 1,240 บาท
    • Steps:
      1. เปิดหน้าตะกร้าสินค้า
      2. คลิกปุ่ม "ลบ" (icon ถังขยะ) ที่รายการ "เสื้อยืดสีดำ"
      3. ถ้ามี confirmation dialog กดยืนยัน "ลบ"
      4. สังเกตรายการสินค้าในตะกร้า
      5. สังเกตราคารวม
    • Expected Result: "เสื้อยืดสีดำ" หายจากรายการ, เหลือ "กางเกงยีนส์" 1 รายการ, ราคารวม = 890 บาท
    • Priority: High | Severity: High
    • Traceability: REQ-CART-005
  2. เขียน test case สำหรับ edge case "ลบสินค้าชิ้นสุดท้าย"

    ดูคำตอบแนะนำ

    TC-CART-021: ลบสินค้าชิ้นสุดท้ายออกจากตะกร้า

    • Preconditions: ผู้ใช้ login แล้ว, ตะกร้ามีสินค้า 1 รายการ: "เสื้อยืดสีดำ" (350 บาท x1)
    • Steps:
      1. เปิดหน้าตะกร้าสินค้า
      2. คลิกปุ่ม "ลบ" ที่รายการ "เสื้อยืดสีดำ"
      3. ถ้ามี confirmation dialog กดยืนยัน "ลบ"
      4. สังเกตสถานะตะกร้า
    • Expected Result: ตะกร้าว่าง, แสดงข้อความ "ตะกร้าของคุณว่างเปล่า", ราคารวม = 0 บาท หรือไม่แสดง, ไม่มีปุ่ม "ชำระเงิน"
    • Priority: Medium | Severity: Medium
    • Traceability: REQ-CART-005
  3. เขียน test case สำหรับ negative case "ลบสินค้าที่ถูกลบไปแล้ว" (concurrent scenario)

    ดูคำตอบแนะนำ

    TC-CART-022: ลบสินค้าที่ถูกลบจาก session อื่นแล้ว

    • Preconditions: ผู้ใช้ login แล้วบน 2 devices/tabs, ตะกร้ามี "เสื้อยืดสีดำ" 1 รายการ, Tab A และ Tab B แสดงตะกร้าเดียวกัน
    • Steps:
      1. ที่ Tab A: คลิกปุ่ม "ลบ" ที่ "เสื้อยืดสีดำ" → ลบสำเร็จ
      2. ที่ Tab B (ยังแสดงสินค้าเดิม): คลิกปุ่ม "ลบ" ที่ "เสื้อยืดสีดำ"
      3. สังเกตพฤติกรรมของระบบ
    • Expected Result: ระบบแสดง error ที่เหมาะสม เช่น "สินค้านี้ถูกลบออกไปแล้ว" หรือ refresh ตะกร้าให้เป็นสถานะล่าสุด, ไม่เกิด error 500 หรือ application crash
    • Priority: Medium | Severity: High
    • Traceability: REQ-CART-005

สิ่งที่ต้องเอาติดตัวไปจากบทนี้

  • หนึ่ง step = หนึ่ง action — อย่ารวมหลาย action ในขั้นตอนเดียว
  • ระบุค่าที่แน่นอน — อย่าใช้คำคลุมเครือ เช่น "ข้อมูลที่ถูกต้อง"
  • Expected result ต้องวัดได้ — "ระบบแสดง X ที่ตำแหน่ง Y" ไม่ใช่ "ระบบทำงานถูกต้อง"
  • แยก test data ออกจาก steps เพื่อ reusability
  • Test data ที่ realistic เจอบั๊กได้มากกว่า data ที่มั่ว ๆ มา