การเขียน Bug Report ที่ Dev อ่านแล้วแก้ได้เลย
bug report ไม่ใช่แค่หลักฐานว่า QA เจอปัญหา แต่มันคือเอกสารสื่อสารที่ต้องพาทีมจาก 'งงว่าเกิดอะไร' ไปสู่ 'แก้ได้เลย' บทนี้จะช่วยให้คุณเขียนรายงานบั๊กที่ชัด กระชับ และลดการถามกลับจากทีมพัฒนา
จบบทนี้แล้วคุณจะ...
- อธิบายได้ว่า bug report ที่ดีควรมีองค์ประกอบอะไรบ้าง
- แยก severity กับ priority ได้ชัดขึ้น
- เขียน steps to reproduce ที่คนอื่นทำซ้ำได้จริง
- รู้ว่าควรใส่ข้อมูลไหนเพื่อช่วย dev หา root cause ได้เร็วขึ้น
- เปลี่ยน bug report จาก “แจ้งว่าพัง” ให้เป็น “ข้อมูลพร้อมลงมือแก้”
เพราะ defect ที่รายงานไม่ชัด เท่ากับทีมยังแก้ปัญหาไม่ถูก
สมมติ QA ส่งข้อความแบบนี้:
“ระบบพังตอนสั่งซื้อ ช่วยดูหน่อย”
สิ่งที่ dev ต้องถามกลับมีทันที:
- พังตรงไหน
- ทำอะไรอยู่ก่อนหน้า
- ใช้ browser / device อะไร
- เกิดทุกครั้งไหม
- มีข้อมูลหรือเงื่อนไขพิเศษหรือไม่
ทุกคำถามที่ต้องถามกลับคือเวลาที่เสียไป และบั๊กยิ่ง critical เท่าไร เวลาที่เสียนี้ยิ่งแพง
bug report ที่ดีจึงไม่ใช่เอกสารที่ยาวที่สุด แต่คือเอกสารที่ทำให้คนอ่าน:
- เข้าใจปัญหาเร็ว
- ทำซ้ำได้
- ประเมินผลกระทบได้
- เริ่มแก้ได้โดยไม่ต้องเดา
เขียนให้ครบเท่าที่จำเป็น ไม่ใช่ครบทุกช่องแบบไม่มีคุณภาพ
| องค์ประกอบ | ใช้ตอบคำถามอะไร | ตัวอย่าง |
|---|---|---|
| Title | ปัญหาคืออะไรแบบสั้นและชัด | “Order ไม่ถูกสร้างหลังชำระเงินผ่าน PromptPay สำเร็จ” |
| Environment | เกิดที่ไหน | iPhone 15, iOS 17, Staging |
| Preconditions | ต้องมีอะไรอยู่ก่อน | ล็อกอินแล้ว, มีสินค้าในตะกร้า |
| Steps to Reproduce | ทำอย่างไรจึงเจอ | Step 1, 2, 3 แบบทำซ้ำได้ |
| Expected Result | อะไรควรเกิด | ระบบควรสร้าง order และแสดงเลข order |
| Actual Result | อะไรเกิดจริง | หน้าจอแจ้งชำระสำเร็จแต่ไม่มี order |
| Severity / Priority | รุนแรงและเร่งด่วนแค่ไหน | Critical / High |
| Evidence | มีหลักฐานอะไร | screenshot, video, log, request id |
คุณไม่จำเป็นต้องมี template ยาวมาก แต่ข้อมูลเหล่านี้คือแกนกลางที่ช่วยให้ report ใช้งานได้จริง
สรุป “อาการ + เงื่อนไขสำคัญ + ผลกระทบ” ให้มากที่สุดในประโยคเดียว
เปรียบเทียบ:
| แบบที่ยังไม่ดี | ปัญหา |
|---|---|
| “ระบบพัง” | กว้างเกิน ไม่รู้ว่าพังอะไร |
| “ชำระเงินไม่ได้” | ยังไม่รู้กับช่องทางไหน ภายใต้เงื่อนไขอะไร |
| “Bug in checkout” | ไม่บอกอาการจริง |
ตัวอย่างที่ดีขึ้น:
- “Order ไม่ถูกสร้างหลังชำระเงินผ่าน PromptPay สำเร็จ”
- “ผู้ใช้ reset password ไม่ได้เมื่อเปิดลิงก์เกิน 1 ชั่วโมง”
- “ระบบคำนวณส่วนลด 10% ผิดเมื่อใช้คูปองร่วมกับ shipping promotion”
Title ที่ดีช่วยให้คนสแกน defect list แล้วเข้าใจภาพรวมได้เร็วมาก
อย่าใช้สองคำนี้แทนกัน
Severity คือความรุนแรงของปัญหาในเชิงพฤติกรรมของระบบ
Priority คือความเร่งด่วนที่ทีมควรแก้ในเชิงธุรกิจหรือแผนงาน
| เรื่อง | Severity | Priority |
|---|---|---|
| ถามว่าอะไร | พังหนักแค่ไหน | ต้องแก้เร็วแค่ไหน |
| มุมมองหลัก | Technical / User impact | Business timing / planning |
| ตัวอย่าง | app crash, data wrong, payment fail | ต้องแก้ก่อน release, แก้ sprint หน้าได้ |
ตัวอย่างให้เห็นภาพ
- logo หน้าแรกผิด: severity อาจต่ำ แต่ priority อาจสูง ถ้าต้อง demo ให้ผู้บริหารวันนี้
- crash เมื่อพิมพ์ emoji ในช่องเฉพาะที่คนแทบไม่ใช้: severity อาจสูง แต่ priority อาจไม่สูงเท่า payment bug
การแยกสองอย่างนี้ออกจะช่วยให้ triage คุยกันง่ายขึ้น
ถ้าคนอื่นทำซ้ำไม่ได้ เขาก็แก้ไม่ได้
steps ที่ดีควรมีลักษณะดังนี้:
- เริ่มจากจุดตั้งต้นที่ชัด
- แต่ละข้อมี 1 action หลัก
- ระบุข้อมูลที่กรอกหรือเงื่อนไขที่ใช้
- บอกจุดที่ต้องสังเกตอาการ
ตัวอย่าง:
ยังไม่ดี
- สั่งอาหาร
- จ่ายเงิน
- ไม่มี order
ดีขึ้น
- เปิดแอปด้วย account
qa_user_01 - ค้นหาร้าน “ข้าวมันไก่ลุงชัย”
- เพิ่มเมนู “ข้าวมันไก่พิเศษ” ลงตะกร้า
- กด “สั่งอาหาร”
- เลือกชำระเงินแบบ PromptPay
- ชำระเงินจนหน้าจอแสดง “สำเร็จ”
- ไปที่หน้า “คำสั่งซื้อของฉัน”
- สังเกตว่าไม่มี order ที่เพิ่งสร้าง
steps ลักษณะนี้ช่วยลดการตีความและทำให้ dev หรือ QA คนอื่นทำซ้ำได้ใกล้เคียงกัน
บางบั๊กแก้เร็วขึ้นมากถ้าเราให้ hint ที่ถูก
ข้อมูลที่มักช่วยมาก:
- เกิดทุกครั้งหรือบางครั้ง
- เกิดเฉพาะ browser / device / payment method ไหน
- เริ่มเกิดหลัง build ไหน
- มี workaround หรือไม่
- เทียบกับกรณีที่ทำงานปกติได้ไหม
ตัวอย่างเช่น:
- “เกิดเฉพาะเมื่อใช้ PromptPay; credit card ปกติ”
- “เกิดเมื่อมีสินค้าเกิน 5 ชิ้น; 1-5 ชิ้นไม่เกิด”
- “เจอบน Safari iOS แต่ Chrome desktop ปกติ”
ข้อมูลเหล่านี้ไม่ได้แทน root cause แต่ช่วยให้ dev narrow down เร็วขึ้นมาก
เห็นความต่างจากผลลัพธ์ที่ทีมได้รับ
แบบแย่
Title: Checkout error
Description: จ่ายเงินแล้วไม่ขึ้นอะไร
ปัญหา:
- ไม่รู้เงื่อนไข
- ไม่รู้ expected / actual
- ไม่รู้ env
- ไม่รู้ reproduce ได้ไหม
แบบดี
Title: Order ไม่ถูกสร้างหลังชำระเงินผ่าน PromptPay สำเร็จ
Environment: iPhone 15, iOS 17, Staging
Preconditions: login แล้ว, มีสินค้า 1 ชิ้นในตะกร้า
Steps: …
Expected: order ถูกสร้างและแสดงใน My Orders
Actual: หน้าแสดงชำระสำเร็จ แต่ My Orders ว่าง
Additional Info: เกิดซ้ำ 3/3 ครั้ง, credit card ไม่พบปัญหา
ผลต่างคือแบบหลังทำให้ dev เริ่ม investigate ได้ทันที
bug report ที่ดูเหมือนครบ แต่ยังใช้งานจริงไม่ดี
1. เขียน title กว้างเกิน
ทำให้ defect list อ่านยาก และ triage ยาก
2. steps กระโดดข้าม context
เช่นเริ่มจาก “กด submit” โดยไม่บอกว่ามาถึงหน้านี้อย่างไร
3. expected result ไม่ชัด
ถ้าไม่รู้ว่าควรเกิดอะไร ก็ยากจะคุยว่าอะไรผิด
4. actual result เป็นความเห็นมากกว่าข้อเท็จจริง
เช่น “ระบบงงมาก” ดีกว่าที่จะเขียนว่า “ปุ่ม Save ไม่ตอบสนองหลังคลิก 10 วินาที”
5. ไม่มี evidence เมื่อ bug ไม่เกิดทุกครั้ง
บั๊ก intermittent จะยิ่งต้องมี screenshot, video, logs หรือ request id ช่วย
แบบฝึก: ปรับ bug report ให้ actionable ขึ้น
title ว่า “Search มีปัญหา” คุณจะทำให้ชัดขึ้นอย่างไร
ดูคำตอบแนะนำ
ต้องเติมอาการและเงื่อนไข เช่น “ระบบไม่แสดงผลลัพธ์เมื่อค้นหาด้วยคำภาษาไทยที่มีเว้นวรรค” หรือ “Search คืนผลลัพธ์ว่างเมื่อเลือก category ร่วมกับ keyword”
ถ้าคุณรู้ว่า bug เกิดเฉพาะบน Safari แต่ไม่เกิดบน Chrome ข้อมูลนี้ควรอยู่ตรงไหน
ดูคำตอบแนะนำ
ควรอยู่ทั้งใน Environment และ Additional Info เพราะเป็นข้อมูลสำคัญในการจำกัดขอบเขตของปัญหา
ถ้าไม่แน่ใจ severity ควรทำอย่างไร
ดูคำตอบแนะนำ
ใส่ระดับที่คุณประเมินจากผลกระทบเบื้องต้นได้ก่อน พร้อมอธิบาย impact ใน report และเปิดให้ทีม triage ปรับร่วมกัน ดีกว่าเว้นว่างหรือใส่แบบเดาโดยไม่มีเหตุผล
bug report ที่ดีจำเป็นต้องยาวเสมอหรือไม่
ดูคำตอบแนะนำ
ไม่จำเป็น สิ่งสำคัญคือความชัด ไม่ใช่ความยาว ถ้าปัญหาง่าย ก็เขียนสั้นได้ แต่ต้องมีข้อมูลพอให้ทำซ้ำและตัดสินใจได้
สิ่งที่ต้องเอาติดตัวไปจากบทนี้
- bug report ที่ดีคือเอกสารสื่อสาร ไม่ใช่แค่การแจ้งว่า “มีบั๊ก”
- ส่วนที่สำคัญที่สุดมักคือ title ที่ชัด, steps ที่ทำซ้ำได้, และ expected / actual ที่ไม่กำกวม
- Severity กับ Priority เป็นคนละเรื่อง และควรถูกใช้แยกกันอย่างตั้งใจ
- ข้อมูลเปรียบเทียบ เช่น “เกิดเฉพาะเมื่อ...” มีค่ามากในการช่วยหา root cause
- ถ้า dev อ่านแล้วเริ่มแก้ได้โดยไม่ต้องถามกลับมาก คุณกำลังเขียน bug report ได้ดีแล้ว