ฝึกเขียน Test Case จริง
ทฤษฎีรู้แล้ว ถึงเวลาลงมือเขียน — เราจะฝึกเขียน test case ที่ชัดเจน ไม่คลุมเครือ และนำไปใช้ซ้ำได้
จบบทนี้แล้วคุณจะ...
- เขียน test steps ที่ชัดเจน ไม่คลุมเครือ
- หลีกเลี่ยงปัญหาที่พบบ่อยในการเขียน test case
- ออกแบบ test case ที่นำไปใช้ซ้ำได้ (reusable)
- เข้าใจเรื่อง test data และการเตรียมข้อมูลสำหรับทดสอบ
กฎ 3 ข้อของ Steps ที่ดี
กฎข้อ 1: หนึ่ง Step = หนึ่ง Action
- ผิด: "เปิดหน้า login แล้วกรอก email และ password แล้วกด submit"
- ถูก:
- เปิดหน้า login
- กรอก email: [email protected]
- กรอก password: Test@1234
- กดปุ่ม "เข้าสู่ระบบ"
กฎข้อ 2: ระบุค่าที่แน่นอน ไม่ใช่คำคลุมเครือ
- ผิด: "กรอก email ที่ถูกต้อง"
- ถูก: "กรอก email: [email protected]"
กฎข้อ 3: ระบุ element ที่ต้องโต้ตอบให้ชัด
- ผิด: "กดปุ่ม"
- ถูก: "กดปุ่ม 'เข้าสู่ระบบ' ที่อยู่ด้านล่างฟอร์ม"
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 ต้องมีผลลัพธ์เดียวที่ชัดเจน
เขียนครั้งเดียว ใช้ได้หลายรอบ
Test case ที่ดีควรออกแบบให้ "นำไปใช้ซ้ำได้" ไม่ว่าจะรันในสภาพแวดล้อมไหน:
หลักการ 1: แยก Test Data ออกจาก Test Steps แทนที่จะ hardcode ค่าในขั้นตอน ให้อ้างอิง test data แยกต่างหาก:
Steps:
- เปิดหน้า login
- กรอก email: [TEST_EMAIL]
- กรอก password: [TEST_PASSWORD]
- กดปุ่ม "เข้าสู่ระบบ"
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 ของตัวเอง สามารถรันในลำดับไหนก็ได้
ข้อมูลทดสอบที่ดีเจอบั๊กได้มากกว่า
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: "สมชาย 🎉"
จาก Requirement สู่ Test Case
Requirement: "ผู้ใช้สามารถปรับจำนวนสินค้าในตะกร้าได้ (1-99 ชิ้น) ราคารวมต้องคำนวณใหม่ทันที"
TC-CART-010: ปรับจำนวนสินค้าจาก 1 เป็น 3
- Preconditions: ผู้ใช้ login แล้ว, มีสินค้า "เสื้อยืดสีดำ" ราคา 350 บาท อยู่ในตะกร้า จำนวน 1 ชิ้น
- Steps:
- เปิดหน้าตะกร้าสินค้า
- ที่สินค้า "เสื้อยืดสีดำ" เปลี่ยนจำนวนจาก 1 เป็น 3
- สังเกตราคารวมของสินค้ารายการนี้
- สังเกตราคารวมทั้งหมดของตะกร้า
- Expected Result: ราคารวมรายการ = 1,050 บาท (350 x 3), ราคารวมตะกร้า update ทันที
- Priority: High | Severity: High
- Traceability: REQ-CART-003
แบบฝึก: เขียน Test Case สำหรับ Shopping Cart Feature
Requirement: "ผู้ใช้สามารถลบสินค้าออกจากตะกร้าได้ เมื่อลบแล้วสินค้าหายจากรายการ ราคารวมคำนวณใหม่ ถ้าตะกร้าว่างให้แสดงข้อความ 'ตะกร้าของคุณว่างเปล่า'"
เขียน test case สำหรับ happy path "ลบสินค้าสำเร็จ" โดยมีครบทุกองค์ประกอบ
ดูคำตอบแนะนำ
TC-CART-020: ลบสินค้าออกจากตะกร้าสำเร็จ
- Preconditions: ผู้ใช้ login แล้ว, ตะกร้ามีสินค้า 2 รายการ: "เสื้อยืดสีดำ" (350 บาท x1) และ "กางเกงยีนส์" (890 บาท x1), ราคารวม 1,240 บาท
- Steps:
- เปิดหน้าตะกร้าสินค้า
- คลิกปุ่ม "ลบ" (icon ถังขยะ) ที่รายการ "เสื้อยืดสีดำ"
- ถ้ามี confirmation dialog กดยืนยัน "ลบ"
- สังเกตรายการสินค้าในตะกร้า
- สังเกตราคารวม
- Expected Result: "เสื้อยืดสีดำ" หายจากรายการ, เหลือ "กางเกงยีนส์" 1 รายการ, ราคารวม = 890 บาท
- Priority: High | Severity: High
- Traceability: REQ-CART-005
เขียน test case สำหรับ edge case "ลบสินค้าชิ้นสุดท้าย"
ดูคำตอบแนะนำ
TC-CART-021: ลบสินค้าชิ้นสุดท้ายออกจากตะกร้า
- Preconditions: ผู้ใช้ login แล้ว, ตะกร้ามีสินค้า 1 รายการ: "เสื้อยืดสีดำ" (350 บาท x1)
- Steps:
- เปิดหน้าตะกร้าสินค้า
- คลิกปุ่ม "ลบ" ที่รายการ "เสื้อยืดสีดำ"
- ถ้ามี confirmation dialog กดยืนยัน "ลบ"
- สังเกตสถานะตะกร้า
- Expected Result: ตะกร้าว่าง, แสดงข้อความ "ตะกร้าของคุณว่างเปล่า", ราคารวม = 0 บาท หรือไม่แสดง, ไม่มีปุ่ม "ชำระเงิน"
- Priority: Medium | Severity: Medium
- Traceability: REQ-CART-005
เขียน test case สำหรับ negative case "ลบสินค้าที่ถูกลบไปแล้ว" (concurrent scenario)
ดูคำตอบแนะนำ
TC-CART-022: ลบสินค้าที่ถูกลบจาก session อื่นแล้ว
- Preconditions: ผู้ใช้ login แล้วบน 2 devices/tabs, ตะกร้ามี "เสื้อยืดสีดำ" 1 รายการ, Tab A และ Tab B แสดงตะกร้าเดียวกัน
- Steps:
- ที่ Tab A: คลิกปุ่ม "ลบ" ที่ "เสื้อยืดสีดำ" → ลบสำเร็จ
- ที่ Tab B (ยังแสดงสินค้าเดิม): คลิกปุ่ม "ลบ" ที่ "เสื้อยืดสีดำ"
- สังเกตพฤติกรรมของระบบ
- 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 ที่มั่ว ๆ มา