เขียนเทส
อันนี้เป็นหน้าจอ Code Coverage ของงานหนึ่ง สีแดงจะแสดงให้เห็นว่า เป็น Code ที่ยังมี Branch Condition ที่ยังไม่ครบอยู่ ขณะที่ ส่วนเขียวๆ จะแสดงให้เห็นว่าการ Test ได้ Cover ไปเรียบร้อยในทุกกรณี
ถ้าโจทย์ มันจบอยู่แต่ใน function ตัวนี้ วิธีที่ง่ายที่สุดคือการ ใส่ค่า test ที่ไม่มีค่า metadata มา มันก็ได้ครบแล้ว
อันนั้นคือ Unit Test
ปัญหาคือ Code ส่วนนี้อยู่ใน Controller ส่วนบนสุด
แล้วก่อนหน้านี้ มีการ verify ด้วย JSON Schema ว่า metadata เป็น required attribute
นั่นแปลว่า
ในการใช้งานจริงนั้น ไม่มีโอกาสเลยที่ จะทำให้ metadata ตัวนี้ไม่มี
และผลเทสก็ได้ยืนยัน แล้วว่า ถ้ามันไม่มีจริงๆ มันจะตายตั้งแต่ JSON Validation ในตอนรับค่าไปเรียบร้อยแล้ว
ตอนนี้เรามีทางเลือกอยู่ 2 ทางคือ
- ไหนๆ ก็เขียนมาแล้ว ทำยังไงก็ได้ให้มัน false ไป
- ลบโค้ดตรงนั้นทิ้ง เพราะยังไง มันก็ unreachable
ถึงตรงนี้ หลายคนก็คงจะตอบข้อหลัง
คำถามคือแล้วถ้าเป็นข้อแรก จะทำยังไง
คำตอบก็คือ ก็ทำ unit test ใส่ไปเฉพาะ function นั้นนั่นเอง
เช่น
it 'no metadata will do nothing' do
expect(normalize({}).to eq {}
end
ถึงตรงนี้ถ้ารู้สึกว่า มัน ไม่ make sense ที่จะเขียนต่อ ก็เข้าใจถูกต้องแล้วครับ
ไม่รู้ว่าจะ Waste Effort ไปเขียนเพิ่มทำไม
นอกจาก เราจะมีแนวโน้มที่จะ reuse function นี้ ในเทอมที่เป็น Generic มากขึ้น
แต่จุดสำคัญในตรงนี้คือ Information ที่ทำให้เราได้ทราบว่า การทดสอบนี้มันไม่ควรจะทำมากกว่า
เมื่อทุกคนมี Information ตรงนี้ มันทำให้การตัดสินใจง่ายขึ้นว่า ควรเขียน หรือไม่ควรเขียน
แต่หลายครั้งที่เราไม่สนใจกับ use case ระดับ high level อย่างจริงจัง แล้วไปหวังพึ่งพาหรือบอกว่าเป็นหน้าที่ของคนอื่นในการทดสอบ
บางครั้งมันอาจจะทำให้เราเสียโอกาสที่จะ ได้รับข้อมูลที่ทำให้เราสามารถลดการเขียนโค้ดที่ไม่จำเป็นได้