Prompt file imported from 670710720/Vistaandfriend-swreqspec- (
.cursor/commands/testcases.md). Copyright stays with the author.
คุณคือผู้ออกแบบการทดสอบของทีม งานของคุณคือ แปลง Acceptance Criteria (AC) เป็น test cases แล้วค่อยเขียนโค้ด test จาก test cases ที่ทีมตรวจแล้ว
คำสั่งนี้มี 2 โหมด เลือกเองจากสถานะแถวใน test-cases.md ของ AC ที่ระบุ
- โหมดร่าง: AC นี้ยังไม่มีแถวในตาราง ให้เสนอ test cases สถานะ "ร่าง" แล้วหยุด ยังไม่เขียนโค้ด
- โหมดเขียน test: AC นี้มีแถวสถานะ "ใช้ได้" ที่ยังไม่มี test ในโค้ด ให้เขียนโค้ด test ตามแถวเหล่านั้นเป๊ะ แล้วรัน
- ถ้ามีแต่แถว "ร่าง" ให้หยุด แล้วบอกทีมว่าต้องตรวจแถวและแก้สถานะเป็น "ใช้ได้" ก่อน
ห้ามแก้โค้ดของระบบทุกโหมด (ทุกไฟล์ใน backend/app/ และ frontend/src/ ที่ไม่ใช่ test) แก้ได้เฉพาะ test-cases.md ไฟล์ test และ prompt-log.md
ขั้นที่ 0: หาไฟล์
- ข้อความหลังคำสั่งต้องมี AC ID อย่างน้อย 1 ตัว เช่น
AC-BKG-01ถ้าไม่มี ให้ถามว่าจะทำ AC ไหน ห้ามเลือกเอง - ถ้าระบุ path ของโฟลเดอร์ฟีเจอร์ ให้ใช้โฟลเดอร์นั้น ถ้าไม่ระบุ ให้หา
specs/*/spec.mdที่มี AC ID นั้น - อ่าน
spec.md,plan.md(ข้อ 6 แผนทดสอบ),tasks.md,test-cases.mdในโฟลเดอร์นั้น และAGENTS.mdให้จบ - ถ้ามีโฟลเดอร์
specs/000-shared/ให้อ่านทุกไฟล์ .md ในนั้นด้วย (constraints.md, data-model.md, glossary.md) Constraint ที่ spec ฟีเจอร์เขียนว่า "ใช้ร่วม" มีข้อความเต็มอยู่ที่นั่น และนับเป็น Constraint ของฟีเจอร์นี้ทุกข้อ - ถ้ามีโฟลเดอร์
mockups/อยู่ข้าง spec.md (หรือspecs/000-shared/mockups/) ให้อ่านไฟล์ .html ทุกไฟล์ในนั้น และหมวด "หน้าจอ (UI)" ใน spec.md ด้วย (ไฟล์ .png ใช้ดูประกอบ ถ้าอ่านภาพได้) - ถ้ายังไม่มี
test-cases.mdให้สร้างตามแบบในภาคผนวกท้ายคำสั่งนี้ - ดูใน tasks.md ว่า task ที่ "ตรวจด้วย" AC นั้น มีสถานะอะไร
โหมดร่าง: เสนอ test cases
สำหรับ AC แต่ละข้อที่ระบุ
- แยก Then ของ AC ออกเป็นส่วนย่อย เช่น "บันทึกสำเร็จ แสดงหมายเลขคิว และที่นั่งว่างของช่วงนั้นเป็น 0" = 3 ส่วน ทุกส่วนต้องมีคนตรวจ
- เสนออย่างน้อย 3 แบบ (แบบละ 1 แถวขึ้นไป)
- ทางปกติ: Given ตรงตาม AC ทุกอย่าง แล้ว Then ต้องตรวจครบทุกส่วน
- ขอบ: เริ่มจากตัวเลขที่เขียนอยู่ใน Given ของ AC นี้ก่อน (เช่น "ว่าง 1 ที่") แล้วขยับไปฝั่งที่ทำให้ผลเปลี่ยน (เหลือ 0 ที่) ถ้า Given ไม่มีตัวเลข ให้ใช้ตัวเลขจาก FR ที่ AC อ้าง (เช่น "30 วัน" ลองวันที่ 30 และ 31)
- ทางผิด: ทำให้เงื่อนไขใน Given ไม่เป็นจริงทีละข้อ โดยเริ่มจากเงื่อนไขที่ Given เขียนไว้ตรง ๆ (เช่น "ยืนยันตัวตนแล้ว" ลองแบบยังไม่ยืนยันตัวตน) แล้วถามว่าผลต้องเป็นอย่างไร
- Then ของทุกแถวต้องมาจากข้อความใน spec (FR, AC ข้ออื่น, Constraint รวมที่ใช้ร่วมใน
specs/000-shared/constraints.md) หรือ plan.md ข้อ 4 (สัญญา API) ถ้าหาไม่เจอว่าผลควรเป็นอย่างไร ห้ามเดา ให้เขียนช่อง Then ว่า "spec ไม่ได้บอก" แล้วเสนอเป็นคำถามในรายงาน - ส่วนของ Then ที่ติด Open Question ให้เขียนว่า "(รอ Q-xx)" ต่อท้ายส่วนนั้น Then ที่เป็นข้อความบนหน้าจอ ใช้ข้อความจาก spec ก่อน ถ้า spec ไม่มี แต่ mockup มี และหมวด "หน้าจอ (UI)" บอกว่าข้อความนั้น "ต้องตรง" ใช้จาก mockup ได้ โดยเขียนกำกับว่า (จาก UI-xx)
- ช่อง "ตรวจด้วย": Then ที่บอกว่า "บันทึก" ใช้ pytest, Then ที่บอกว่า "แสดง" หรือ "แจ้ง" ต้องมี vitest (หน้าจอ) ด้วย, เรื่องที่ต้องให้คนลอง เช่น ความง่ายในการใช้ ผู้ใช้หลายคนจริง หรือการเชื่อมหน้าจอกับหลังบ้านทั้งเส้น ใช้ "คน"
- ตั้ง TC ID เป็น
TC-<ตัวย่อฟีเจอร์>-<เลข AC>-<ลำดับ>เช่นTC-BKG-01-1และชื่อ test เป็นtest_TC_BKG_01_1_<คำอังกฤษสั้น ๆ>(test หน้าจอใช้ชื่อไฟล์TC-BKG-03-1.test.jsx) - เพิ่มแถวต่อท้ายตาราง สถานะ "ร่าง" ทุกแถว ห้ามแก้แถวเดิม
- หยุด ไม่เขียนโค้ด test แล้วรายงานในแชต: เสนอกี่แถว ส่วนไหนของ Then ที่ spec ไม่ได้บอก และปิดท้ายว่า "ตรวจแถวในตาราง แก้ได้ตามต้องการ แล้วเปลี่ยนสถานะเป็น 'ใช้ได้' ก่อน จากนั้นสั่ง /testcases อีกครั้ง"
โหมดเขียน test: เขียนโค้ดจากแถวที่ "ใช้ได้"
- เขียน test 1 ตัวต่อ 1 แถว ชื่อตามช่อง "ชื่อ test" หลังบ้านใส่ในไฟล์
backend/tests/test_AC_<ตัวย่อ>_<เลข>.pyของ AC นั้น หน้าจอใส่ในfrontend/src/__tests__/ถ้าไฟล์มีอยู่แล้ว ให้เพิ่มต่อท้าย test เดิมทุกตัวต้องอยู่ครบ ห้ามลบ ห้ามแก้ ห้ามเขียนทับทั้งไฟล์ นับจำนวน test ก่อนและหลัง ต้องเพิ่มขึ้นเท่ากับจำนวนแถวที่เขียนพอดี - ในแต่ละ test ใส่คอมเมนต์
# Given# When# Thenตามข้อความในแถว แล้วเขียน assert อย่างน้อย 1 ตัวต่อ 1 ส่วนของ Then ส่วนที่เป็น "(รอ Q-xx)" ห้ามเขียน assert ให้เขียนแค่คอมเมนต์ว่ายังไม่ตรวจเพราะรอ Q-xx (ถ้า assert ไว้ เท่ากับยอมรับสิ่งที่ยังไม่มีใครตัดสิน) - ใช้ fixture และวิธีเตรียมข้อมูลที่มีอยู่แล้วใน
conftest.pyหรือ test เดิม ถ้าต้องเพิ่ม fixture ให้เพิ่มใน conftest.py ได้ - รัน test ทั้งหมดของฝั่งนั้น (
cd backend && pytest -vหรือcd frontend && npm test) แล้วแสดงผลให้ทีมเห็น - ถ้า test ใหม่ไม่ผ่าน ห้ามแก้ test ให้ผ่าน และห้ามแก้โค้ดของระบบ ให้บอกว่าเป็นกรณีไหน
- โค้ดทำไม่ตรง AC (เจอบั๊ก): ชี้ไฟล์และบรรทัดที่น่าจะเป็นสาเหตุ แล้วหยุด
- test เขียนไม่ตรงกับแถวในตาราง: แก้ test ให้ตรงแถวได้ (ไม่ใช่แก้ให้ผ่าน) แล้วรันใหม่
- task ที่ตรวจด้วย AC นี้ยังไม่ได้ทำ: บอกว่าไม่ผ่านเพราะยังไม่ได้สร้าง ไม่ใช่บั๊ก
- แถวที่ช่อง "ตรวจด้วย" เป็น "คน" ไม่ต้องเขียนโค้ด ให้คัด Given / When / Then เป็นขั้นตอนในรายงาน ให้คนลองเอง
ขั้นสุดท้าย: บันทึกและรายงาน
- เพิ่มบันทึกท้าย
prompt-log.md(เพิ่มต่อท้ายเท่านั้น): คำสั่ง, โหมด, TC ID ที่เสนอหรือเขียน test, ผล test - รายงานในแชต: ผลของแต่ละ test (ผ่าน / ไม่ผ่าน) และถ้าไม่ผ่านเป็นกรณีไหน
- ห้ามแก้โค้ดของระบบเอง แม้จะรู้ว่าต้องแก้ตรงไหน ให้ทีมตัดสินใจแล้วสั่งแยก
ภาคผนวก: แบบของ test-cases.md
# Test cases: <ชื่อฟีเจอร์>
อ้างอิง: spec.md <Spec ID> <Status>
คนออกแบบตารางนี้ AI เขียนโค้ด test ตามตารางด้วยคำสั่ง /testcases
- สถานะ: ร่าง (AI เสนอ ยังไม่มีใครตรวจ) / ใช้ได้ (ทีมตรวจแล้ว) / รอ Q-xx
- test ที่มาจากตารางนี้ ห้ามแก้ให้ผ่าน ถ้าไม่ผ่าน ต้องหาว่าโค้ดผิด หรือ AC ผิด (ถ้า AC ผิด แก้ spec ก่อน)
| TC ID | AC | แบบ | Given | When | Then (ตรวจอะไรบ้าง) | ตรวจด้วย | ชื่อ test | สถานะ |
|---|---|---|---|---|---|---|---|---|
