𝗘𝘃𝗲𝗿𝘆 𝗧𝗲𝘀𝘁 𝗣𝗮𝘀𝘀𝗲𝗱. 𝗧𝗵𝗲 𝗨𝘀𝗲𝗿 𝗦𝘁𝗶𝗹𝗹 𝗖𝗼𝘂𝗹𝗱𝗻'𝘁 𝗣𝗹𝗮𝘆 𝘁𝗵𝗲 𝗚𝗮𝗺𝗲

"API ส่งค่ากลับมาเป็น 200 OK!"

ตอนที่ผมทำงานวิศวกรที่แรก ผมได้เห็นปัญหาใหญ่ประการหนึ่ง รุ่นพี่ของผมชอบดูแดชบอร์ด พวกเขาชอบค่า code coverage ที่สูงๆ พวกเขาคิดว่าถ้าผลการทดสอบเป็นสีเขียว (ผ่านหมด) แสดงว่าผลิตภัณฑ์นั้นใช้งานได้แล้ว

แต่พวกเขาคิดผิด

การที่โค้ดทำงานได้ กับการที่มนุษย์ได้รับสิ่งที่ต้องการนั้นเป็นคนละเรื่องกัน ปุ่มหนึ่งปุ่มอาจจะส่งรหัสความสำเร็จ (success code) กลับมา แต่กลับทิ้งให้ผู้ใช้ติดค้างอยู่บนหน้าจอที่พัง

ผมจึงสร้างวิธีการค้นหาทางตันของ UX เหล่านี้โดยไม่ต้องรันแอปพลิเคชัน ผมเรียกมันว่า two-agent static walkthrough ซึ่งใช้ AI agent สองตัวคุยกันเป็นลูป

  • Agent A คือผู้ใช้ Agent นี้มีเป้าหมายที่เฉพาะเจาะจง มีความดื้อรั้น ไม่ยอมแพ้แม้จะเจอข้อผิดพลาดเพียงครั้งเดียว และจะพยายามลองเส้นทางต่างๆ ต่อไป
  • Agent B คือแอปพลิเคชัน มีสิทธิ์ในการอ่าน source code จริงๆ สามารถไล่ตามเส้นทางของโค้ด (code path) จากทุกการกระทำของผู้ใช้ รายงานสิ่งที่โค้ดทำอย่างแม่นยำ พร้อมระบุชื่อไฟล์และเลขบรรทัด และไม่สามารถจินตนาการถึงสิ่งที่ไม่มีอยู่จริงในโค้ดได้

ผมได้ทดสอบมันกับเครื่องมือสร้างมินิเกม AI ที่มีข้อผิดพลาด และนี่คือสิ่งที่เกิดขึ้น:

รอบที่ 1: ปุ่มทำงานล้มเหลว ผู้ใช้คลิก "Generate" แต่โค้ดกลับส่งคำขอไปยัง endpoint เก่าที่ตายไปแล้วแทนที่จะเป็นอันใหม่ ผลการทดสอบผ่านฉลุยเพราะ API ตัวเก่ายังคงทำงานได้อยู่

รอบที่ 2: ความว่างเปล่าที่คลิกไม่ได้ ผู้ใช้พยายามคลิกที่ผลลัพธ์ แต่โค้ดกลับวางข้อความไว้ในกล่องธรรมดาที่ไม่มี click handler ทำให้ไม่มีอะไรเกิดขึ้นเลย

รอบที่ 3: คำอวยพรที่หลอกลวง ผู้ใช้พยายามแก้ไขข้อผิดพลาด แต่ backend ล้มเหลวเนื่องจาก ID หายไป หน้าจอกลับแสดงข้อความความสำเร็จเป็นสีเขียว ทั้งที่ระบบพังไปแล้ว

รอบที่ 4: ความหวังที่ถูกตัดตอน ผู้ใช้พยายามคัดลอกโค้ดด้วยตัวเอง แต่ API กลับตัดข้อความทิ้งกลางคัน ทำให้โค้ดใช้งานไม่ได้

สุดท้ายผู้ใช้ก็เลิกใช้งาน

Unit test ส่วนใหญ่ตรวจสอบแค่ว่า endpoint ส่งค่า 200 กลับมาหรือไม่ แต่ไม่ได้ตรวจสอบว่าผู้ใช้บรรลุเป้าหมายที่ต้องการจริงๆ หรือเปล่า

วิธีนำไปใช้:

  • ทำให้ user agent มีความดื้อรั้น เพราะบั๊กที่แท้จริงมักซ่อนอยู่หลังความผิดพลาดครั้งแรก
  • ให้ app agent อ้างอิงจากโค้ดจริง สิ่งนี้จะเปลี่ยนการสวมบทบาท (role-play) ให้กลายเป็นรายงานบั๊กที่ใช้งานได้จริง
  • ใช้สิ่งนี้เป็นส่วนเสริมของการทดสอบของคุณ มันจะช่วยหาช่องว่างในจุดที่ตรรกะของคุณมาบรรจบกับความเป็นจริง

วิธีนี้เป็นแบบ static และมีต้นทุนต่ำ สามารถรันได้ก่อนที่คุณจะเขียน test fixture แม้แต่ตัวเดียว มันเปลี่ยนจาก "โค้ดทำงานได้" เป็น "ผู้ใช้ทำสำเร็จ"

Source: https://dev.to/terum/every-test-passed-the-user-still-couldnt-play-the-game-388o

Optional learning community: https://t.me/GyaanSetuAi