เทสต์เท่าไหร่ถึงเรียกว่าพอ

คำถามนี้โผล่ขึ้นมาทุกครั้งที่มีคนเสนอเพิ่มเทสต์ และคำตอบที่ได้ยินบ่อยที่สุดคือ "80% coverage" ซึ่งเป็นตัวเลขที่ฟังดูมีเหตุผลแต่ไม่ได้ตอบอะไรเลย

coverage บอกแค่ว่าโค้ดบรรทัดไหนถูกรันระหว่างเทสต์ ไม่ได้บอกว่าพฤติกรรมที่รันนั้นถูกหรือไม่ เทสต์ที่เรียกฟังก์ชันแล้วไม่ assert อะไรเลยก็นับ coverage ได้เต็ม ๆ

คำถามที่ดีกว่าคือ เทสต์นี้พังแล้วเสียใจไหม

เทสต์ที่มีค่าคือเทสต์ที่ถ้าแดงขึ้นมาแล้วคุณรีบแก้ ส่วนเทสต์ที่พังแล้วคุณเข้าไปแก้เทสต์ให้ผ่าน อันนั้นคือภาระ ไม่ใช่เกราะป้องกัน

เริ่มตรงไหนถ้ามีเวลาจำกัด

  1. ตรรกะที่เกี่ยวกับเงิน — คิดราคา ส่วนลด ภาษี ค่าธรรมเนียม พิดทีเดียวก็เสียหาย
  2. สิทธิ์การเข้าถึง — ใครเห็นอะไรได้บ้าง พลาดแล้วกระทบกับคนอื่น
  3. โค้ดที่เคยพังมาแล้ว — ทุกครั้งที่แก้บั๊ก ให้เขียนเทสต์กำกับไว้ก่อน
  4. กฎเกณฑ์ทางธุรกิจที่ซับซ้อน — เงื่อนไขซ้อนกันหลายชั้น คนอ่านโค้ดไม่มีทางรู้เจตนาเดิม

สัดส่วนที่ใช้ได้จริง

สามเหลี่ยมเทสต์เป็นภาพที่รู้กันดี แต่สัดส่วนเป๊ะ ๆ ขึ้นกับงาน ถ้าทำ CRUD ธรรมดา unit เยอะ ๆ อาจเป็นภาระมากกว่าการเทสต์ทั้ง endpoint จริงจำนวนน้อย ๆ

ชนิดเหมาะกับข้อควรระวัง
Unitตรรกะที่มีเงื่อนไขเยอะ คำนวณ กฎธุรกิจmock มากเกินจนเทสต์กลายเป็นเทสต์ mock
Integrationการคุยกับฐานข้อมูลหรือระบบอื่นช้ากว่า ต้องเตรียมข้อมูลทดสอบ
End-to-endเส้นทางหลักที่พังไม่ได้เปราะและช้า ทำน้อยแต่ให้นิ่ง

สัญญาณว่าเทสต์มากเกินไป

  • แก้โค้ดนิดเดียวแล้วเทสต์แดง 30 ตัวโดยที่พฤติกรรมไม่ได้เปลี่ยน
  • ทีมเริ่มกลัวการ refactor เพราะต้องตามแก้เทสต์เยอะ
  • มีเทสต์ที่เขียนเพื่อดัน coverage โดยไม่มีใครอ่านมันอีกเลย

เป้าหมายของเทสต์ไม่ใช่ตัวเลขสวย ๆ แต่คือความกล้าที่จะกด deploy บ่ายวันศุกร์ ถ้าคุณกล้าขึ้น แปลว่าเทสต์ทำหน้าที่ของมันแล้ว

ความคิดเห็น

กำลังโหลดความคิดเห็น