AI สำหรับการสร้าง Test: จุดที่ช่วยได้ และจุดที่หลอกลวง
AI เขียน test ได้รวดเร็ว แต่มันก็เขียน test ที่ดูเหมือนจริงแต่กลับตรวจสอบในสิ่งที่ไม่ถูกต้อง คุณอาจเห็น coverage เพิ่มขึ้น แต่โค้ดของคุณก็ยังคงพังอยู่ดี
AI นั้นยอดเยี่ยมสำหรับบางงาน จงใช้มันเพื่อ:
- ต่อยอดจากตัวอย่างที่ดี หากคุณเขียน test ที่สมบูรณ์แบบไว้หนึ่งอัน AI สามารถเขียนเพิ่มให้อีกสิบอันในสไตล์เดียวกับคุณเป๊ะๆ
- จัดการงานพิมพ์ที่ซ้ำซาก ใช้มันสำหรับ setup blocks, teardown และ factory helpers
- สร้างโครงสร้างเริ่มต้น (scaffolding) มันช่วยให้คุณเริ่มเขียนใน editor ได้เร็วกว่าการเริ่มจากไฟล์ว่างๆ
อันตรายจะเริ่มขึ้นเมื่อคุณปล่อยให้ AI เป็นคนตัดสินใจเรื่อง "contract"
หากคุณส่ง function ให้ AI แล้วขอให้มันเขียน test มันจะอ่านโค้ดและทดสอบในสิ่งที่โค้ดนั้น "กำลังทำอยู่" แต่มันไม่ได้ทดสอบในสิ่งที่โค้ด "ควรจะทำ" สิ่งนี้ทำให้เกิดวงจรปิด (closed loop) โดย AI จะตั้งสมมติฐาน เขียนโค้ด และจากนั้นก็เขียน test ที่สอดคล้องกับสมมติฐานเดิมนั้นเอง
เมื่อบั๊กหลุดไปถึง production นั่นเป็นเพราะชุด test นั้นอยู่ฝั่งเดียวกับบั๊ก
ระวังกับดัก 3 อย่างนี้:
Implementation-shaped tests AI มักจะทดสอบเส้นทางของ logic แทนที่จะทดสอบ business rules หากคุณเปลี่ยนรายละเอียดภายในเพียงเล็กน้อย test ก็จะพัง แม้ว่าผลลัพธ์จะยังถูกต้องก็ตาม สิ่งนี้ทำให้การ refactoring กลายเป็นฝันร้าย
Shallow edge cases AI เก่งในการทดสอบค่า null, empty strings และเลขศูนย์ ซึ่งเป็นเรื่องที่เห็นได้ชัด แต่มันไม่สามารถหา "domain edges" ได้ มันไม่รู้เรื่องบั๊กเกี่ยวกับ timezone เฉพาะทาง, ความแปลกของ database หรือ business rules ที่เป็นเอกลักษณ์ของคุณ
Brittle mocks AI ชอบ mock ทุกอย่าง ซึ่งนำไปสู่ปัญหา 2 ประการ:
- Mock นั้นผิด มันเลียนแบบ API เวอร์ชั่นปลอมที่ไม่ตรงกับความเป็นจริง
- Mock ทำให้ implementation ถูกแช่แข็งไว้ มันทดสอบว่าโค้ดของคุณเรียก function อื่นอย่างไร แทนที่จะทดสอบผลลัพธ์สุดท้ายที่ได้
วิธีใช้ AI อย่างถูกต้อง:
เก็บ "เจตนา" (intent) ให้อยู่พ้นจากขอบเขตของ AI
- เขียน contract ก่อน เขียนประโยคภาษาอังกฤษง่ายๆ หนึ่งประโยคสำหรับทุกๆ test ตัวอย่างเช่น: "Expired codes must return the original amount."
- ส่งประโยคเหล่านั้นให้ AI ปล่อยให้มันเขียน assertions แต่คุณต้องเป็นคนกำหนดความหมาย
- Mock เฉพาะที่ขอบเขต (boundaries) เท่านั้น ให้ mock เฉพาะ external APIs หรือ databases แต่ให้ใช้เวอร์ชั่นจริงสำหรับ internal modules ของคุณเอง
- เขียน domain edge case ด้วยตัวเองหนึ่งอย่าง ทุกครั้งที่คุณเขียน function เสร็จ ให้เขียนสิ่งหนึ่งที่คุณกังวลลงไป แล้วใช้สิ่งนั้นเป็น prompt สำหรับ AI
AI คือเครื่องมือเพิ่มประสิทธิภาพการทำงาน ไม่ใช่สิ่งที่จะมาแทนที่การคิด จงใช้มันเพื่อเขียนเนื้อหา (body) ของ test แต่อย่าปล่อยให้มันตัดสินใจว่า test นั้นมีไว้เพื่ออะไร
Source: https://dev.to/nazar_boyko/ai-for-test-generation-where-it-helps-and-where-it-lies-jhm
Optional learning community: https://t.me/GyaanSetuAi
