AI สำหรับการสร้าง Test: จุดที่ช่วยได้ และจุดที่ควรระวัง
AI เขียน test ได้รวดเร็ว แต่มันก็เขียน test ที่ดูเหมือนจริงแต่กลับตรวจสอบผิดจุดด้วยเช่นกัน
คุณวางฟังก์ชันลงใน AI เพียงสามสิบวินาทีต่อมา คุณก็ได้ test ที่ผ่านการทดสอบถึงสิบสองรายการ คะแนน coverage ของคุณเพิ่มขึ้น คุณรู้สึกว่าตัวเองทำงานได้มีประสิทธิภาพ
จากนั้นบั๊กก็โผล่มาใน production เมื่อคุณกลับไปดู test ทั้งสิบสองรายการนั้น คุณจึงตระหนักว่าไม่มีตัวไหนเลยที่จะตรวจจับบั๊กนี้ได้
AI ทดสอบในสิ่งที่โค้ดของคุณ "ทำ" ไม่ใช่สิ่งที่โค้ดของคุณ "ควรจะทำ"
AI มีประโยชน์ แต่คุณต้องรู้วิธีใช้งานมัน
จุดที่ AI ทำได้ดี:
- การสร้าง boilerplate เช่น setup และ teardown blocks
- การเขียน factory helpers และ data objects ที่ซ้ำซาก
- การสร้างรูปแบบ test pattern ที่หลากหลายจากต้นแบบที่ดีเพียงชุดเดียว
- การจัดการ edge cases ที่เห็นได้ชัด เช่น null, empty strings หรือ zero
จุดที่ AI ล้มเหลว:
- การทดสอบที่ยึดตามการ Implement (Implementation-based tests): มันเขียน test ที่เดินตามโครงสร้างของโค้ดแทนที่จะเป็น business logic หากคุณทำการ refactor โค้ด test เหล่านี้จะพังทันที แม้ว่าผลลัพธ์จะยังถูกต้องก็ตาม
- Edge cases ที่ผิวเผิน: มันตรวจพบข้อผิดพลาดที่เห็นได้ชัด แต่พลาดบั๊กเฉพาะทางของโดเมน (domain-specific bugs) มันไม่รู้เรื่องความซับซ้อนของ timezone, ข้อจำกัดของฐานข้อมูล หรือกฎทางธุรกิจเฉพาะของคุณ
- Mock ที่เปราะบาง: มันทำ mock บริการภายในที่ควรจะเป็นของจริง ซึ่งทำให้การดูแลรักษา test เป็นไปได้ช้าและพังได้ง่ายเมื่อมีการ refactor
วิธีใช้ AI โดยไม่สร้าง "ละครโรงทดสอบ" (test theater):
- กำหนดสัญญา (contract) เป็นอันดับแรก เขียนประโยคภาษาอังกฤษง่ายๆ หนึ่งประโยคว่า test นี้ต้องพิสูจน์อะไร ตัวอย่างเช่น: "An expired code must return the original amount."
- ส่งประโยคนั้นให้ AI ปล่อยให้ AI เขียนโค้ด แต่คุณต้องเป็นเจ้าของเจตจำนง (intent) นั้น
- ทำ mock เฉพาะที่ขอบเขต (boundary) เท่านั้น ใช้ instance จริงสำหรับโมดูลภายในของคุณ และทำ mock เฉพาะ API หรือฐานข้อมูลภายนอกเท่านั้น
- เขียน domain edge case ด้วยตัวเองหนึ่งอย่าง AI จัดการ edge cases ที่ "เห็นได้ชัด" ส่วนคุณต้องจัดการ edge cases แบบ "ตีสาม" (3 AM) ที่เป็นสาเหตุของอุบัติการณ์ใน production จริงๆ
อย่าปล่อยให้ AI ตัดสินใจว่า test จะตรวจสอบอะไร ใช้มันเพื่อพิมพ์โค้ด แต่คุณต้องเป็นคนให้ตรรกะ (logic)
Source: https://dev.to/nazar_boyko/ai-for-test-generation-where-it-helps-and-where-it-lies-jhm
