เจอคำถามที่น่าสนใจมากๆ ตอนไปแบ่งปันเรื่อง TDD (Test-Driven Development)
ดังนั้น จึงเอามาอธิบายขยายความในคำตอบ เพื่อให้เข้าใจมากขึ้น
ประกอบไปด้วยคำถามดังนี้

คำถามแรก

ถ้าทำแต่ Unit test แต่ไม่ได้ทำตามแนวคิด TDD มันจะดีไหม หรือมีคุณค่าอะไรบ้างไหม ?

คำตอบ
มีคุณค่าสิครับ และ ดีแน่นอน
ที่แน่ๆ ดีกว่าไม่มี Unit test อย่างแน่นอน
เพราะว่า คุณจะรู้ได้อย่างไรว่า code ที่คุณเขียนขึ้นมานั้นทำงานถูกต้อง
บางครั้งคุณอาจจะต้องการทดสอบ เช่น unit test ขึ้นมา

ในการเขียน test ขึ้นมานั้น ไม่จำเป็นต้องใช้ test framework ก็ได้นะครับ
เพราะว่า หลายๆ คน มักจะถามเสมอว่า ภาษานี้ใช้ test framework อะไร
สิ่งที่ขอบอกเลยก็คือ สิ่งที่คุณควรสนใจก็คือ

  • คุณต้องการจะทดสอบอะไร
  • ต่อจากนั้นคือ คุณจะทดสอบอย่างไร

เนื่องจากการเขียน test ไม่ใช่เพียงการทดสอบเท่านั้น
แต่มันคือการบอกว่า คุณเข้าใจในสิ่งที่กำลังจะสร้างขึ้นมาหรือไม่

คำถามต่อมาก็คือ

ถ้าต้องมาเขียน unit test ของ code ที่เสร็จหรือทำงานอยู่แล้วล่ะ มันจะดีไหม แล้วต้องใช้เวลาเพิ่มไหม ?

คำตอบ
ถ้าเขียน test ตามทั้งหมดของ code ของบอกได้เลยว่านรกมากๆ (แปรผันตามเวลาหลังจากเขียน code เสร็จ)
มันเหมือนเป็นการลงทุนสร้างอีกระบบขึ้นมา
และไม่ได้บอกด้วยว่าเขียน test มาแล้ว
มันจะทำให้ระบบเป็นไปตามที่เราคาดหวังหรือไม่

ดังนั้นขอแนะนำใหม่ตามข้างล่างนี้

Code เหล่านี้ผมขอเรียกว่า Legacy Code นะ เพราะว่ามันเป็น code ที่ไม่มี test
ในการเขียน test ให้กับ Legacy code หรือ code ใหม่ๆ นั้น
แนะนำให้นักพัฒนาทุกคน ทำง่ายๆ  ตามแนวคิด Test First หรือ TDD ดังนี้

  • ก่อนที่จะเขียน code ใดๆ ก็ตาม ต้องเขียน test ที่มัน fail ขึ้นมาก่อนเสมอ
  • เพิ่ม test เข้าไปสำหรับ Legacy code ก็ต่อเมื่อคุณต้องการแก้ไขมัน
  • เพิ่ม test เข้าไปสำหรับ Legacy code ก็ต่อเมื่อคุณต้องทำความเข้าใจกับมัน

ถ้านอกเหนือจากนี้ อย่าไปเพิ่ม test เข้าไปยัง legacy code โดยเด็ดขาดนะ

การเขียน test สำหรับ Legacy code นั้นจำเป็นต้องใช้เวลาเยอะมาก

เนื่องจากคุณต้องทำความเข้าใจการทำงานของ code ว่าถูกและผิดเป็นอย่างไร
และส่วนมาก Legacy code จะทดสอบยากมากๆ
คุณจำเป็นจะต้อง refactor code เพื่อให้สามารถทดสอบได้นั่นเอง

มาดูรูปอธิบายกันนิดนึง
ถ้าเราเขียน test หลังจาก code เสร็จ เรามักจะเจอภาพแบบนี้ เพื่อใช้อธิบาย

Screen Shot 2557-09-12 at 1.13.14 AM

แต่ในการทำงานจริงๆ มันมีขั้นนตอนที่มากกว่านั้น
ซึ่งหลายๆ คนมักจะไม่สนใจเท่าไร
แต่มันใช้เวลาที่สูงมาก จนคุณเองอาจจะไม่เชื่อก็ได้ ดังรูป

Screen Shot 2557-09-12 at 1.12.15 AM

ถ้ายังต้องจัดการกับ Legacy Code ผมแนะนำหนังสือ Working Effectively with Legacy Code

Screen Shot 2557-09-12 at 12.56.59 AM

และ VDO แนะนำให้ดูเพิ่มเติม เรื่อง  Test Driven Development : A Love Story
เป็น VDO ที่สนุกมากๆ ครับ ซึ่งสามารถสรุปเรื่องของ TDD ได้คร่าวๆ ดังนี้

  • TDD  คือ การเดินทาง แต่เป็นการเดินทางของ code ซึ่งพร้อมเปลี่ยนแปลงอยู่เสมอ
  • TDD เข้ามาเปลี่ยน code ของคุณ
  • TDD เข้ามาเปลี่ยนวิธีการ coding ของคุณ
  • TDD เข้ามาเปลี่ยนคุณ
  • TDD ถูกสร้างขึ้นมาด้วยตามคุณ
  • TDD ทำให้คุณรู้ว่า คุณกำลังทำอะไรอยู่
  • TDD ทำให้คุณมั่นใจ
  • TDD ทำให้คุณรักใน code และ การทดสอบแบบอัตโนมัติ

Reference Websites
Does unit testing add value when we’re not doing TDD?
Does unit testing add value in a non-TDD shop?