Test Coverage 100% – ทำไปทำไม? (นะ)

ผมรู้สึกตกใจเมื่อได้ยินใครคนหนึ่งบอกว่า เป้าหมายของเขาคือการสร้าง xUnit test ให้ได้ test coverage 100% ผมคิดว่า นั่นเป็นความคิดที่ไม่เข้าท่าเอามากๆ

ในโค้ดนั้นความจริงมีทั้งโค้ดที่สมควรมี xUnit test และไม่สมควรมี ตัวอย่างที่เห็นได้ชัดคือ ตระกูล getter setter ทั้งหลาย ที่มี test ไปก็ไม่ช่วยให้มีอะไรดีขึ้นเลย เป็นความสูญเปล่าโดยแท้จริง แต่ก็อีกนั่นแหละ เขาก็บอกว่า ที่บอกว่า 100% นี่ไม่รวม getter setter นะ เพรา tool สั่งให้ ข้ามมันไปได้

นอกจาก getter setter แล้ว โค้ดลำดับต่อไปที่ไร้ประโยชน์ที่จะทำ xUnit test คือ พวก ที่ทำหน้าที่ render UI ไม่ใช่ว่ามันทำไม่ได้ ถ้าจะ search ดูใน net แล้วก็จะมีเฟรมเวิร์คหลายตัวที่ออกตัวว่า รองรับการ test UI แต่ปัญหาคือ UI นั้นมีการเปลี่ยนแปลงบ่อยๆ ทำให้ค่าใช้จ่ายในการ maintain xUnit test code นั้นมีมหาศาล และที่สำคัญมันเป็นสิ่งที่มองเห็นได้ด้วยตา การใช้คนในการทำ test นี้ จึงเป็นเรื่องที่สมเหตุสมผลกว่ากันมาก

อีกอันที่ไม่ค่อยสมเหตุสมผลในการเขียน xUnit test คือ Data Access Layer ตัวอย่างเช่น พวก DAO ที่ใช้ต่อกับ database หรือ พวก file handling หรือ พวก network service หรือ web service ต่างๆ เหตุผลที่ส่วนพวกนี้ไม่เหมาะในการทำ xUnit test นั้นไม่ใช่เป็นเพราะ มันไม่ควร test แต่เป็นเพราะ มันเป็นส่วนที่ต้องติดต่อกับ system อื่น หรือ เป็นการใช้ library ตรงๆ จึงไม่เหมาะที่จะทำเป็น Unit test เพราะ จะกลายเป็นการทำ integration test แทน ซึ่งผิดวัตถุประสงค์ ของการทำ unit test ที่จะต้องเสร็จเร็วเพื่อให้สามารถ run ได้บ่อย เท่าที่ต้องการ คนที่เริ่มต้นทำ xUnit มักจะประสบปัญหาว่า run แล้ว data เปลี่ยน แล้วไม่รู้จะทำอย่างไร หรือ ไปใช้พวก mocking framework กลายเป็น ไม่สามารถป้องกันปัญหาจากโค้ดของตนเองได้ เพราะ ส่วน mock กับส่วนของจริง ทำงานไม่เหมือนกัน

ความพยายามที่จะทำให้ test coverage เป็น 100% จึงเป็นความสูญเปล่าโดยแท้จริง ที่ถูกแล้วการเขียน xUnit test นั้นควรใช้กับส่วนที่เป็น business logic เท่านั้น กล่าวคือ ส่วนอื่นๆ ที่ติดต่อกับ system อื่น หรือ เป็น UI นั้นควรใช้การ test วิธีอื่นแทน ไม่ใช่ unit test และถ้าหากมี business logic ปะปบไปในส่วนที่ไม่ควร unit test เหล่านั้น ก็เชื่อแน่ว่า มีการออกแบบ architecture ผิดพลาด หรือไม่การทำผิด architecture ที่ออกแบบไว้นั่นเอง

Advertisements

ใส่ความเห็น

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s