ทำไมต้องใช้ TDD (Test Driven Development) ?

kidpeterpan
Jul 22, 2017 · 3 min read

TDD (Test Driven Development) คืออะไร?

TDD คือการเขียนโปรแกรมโดยมีการเขียน Test case ขึ้นมาเป็นอันดับแรก ฟังดูแล้วอาจจะน่าเบื่อสำหรับใครหลายคน เพราะปกติแล้ว Programmer อย่างเราๆ ส่วนมาก เกือบ 100% ได้ Requirement มาแล้วก็เรียกได้ว่า ลุยกันเลยทีเดียว ส่วนเรื่อง Test ก็จะมาทำก็ต่อเมื่อโปรแกรมเสร็จแล้ว หรือ Run Test กันเป็น Feature ไป ซึ่งกรณีที่โปรแกรมใหญ่ขึ้น กว่าจะรู้ตัวอีกทีว่าผิด หรือส่วนที่เราสร้างขึ้นใหม่นั้นไปกระทบส่วนอื่น บางทีเราก็ออกมาไกลเกินไปแล้ว อาจจะใช้เวลานานในการหาจุดผิดหรือจุดที่ไปกระทบ อย่างโชคดีที่สุดคือ Tester เจอก่อนที่มันจะหลุดไปถึง Production นี่เป็นคำตอบที่ดีที่สุด ที่อาจบอกได้ว่าทำไมเราต้องใช้ TDD เข้ามาช่วย พูดมาถึงจุดนี้แล้ว สรุปแล้วมันคืออะไร ถ้าพูดแบบสั้นๆ เลย TDD ก็คือ

Spec ของ Program ที่มันสามารถ Execute ได้

ใช่แล้วครับ แต่ก่อนเราเขียน Spec ลงไปในเอกสารต่างๆ เช่น Microsoft word, Microsoft excel ซึ่งถ้าโปรแกรมถูกพัฒนามานานแล้ว มีหลายครั้งที่ Spec ไม่ได้ถูก Update ตามไปด้วย เพื่อให้เห็นภาพเราลองมาเขียนโปรแกรมแบบ TDD อย่างง่ายกันครับ

ขั้นตอนในการเขียนโปรแกรมแบบ TDD มีอย่างไรบ้าง?

ที่มา:http://hanwax.github.io/assets/tdd_flow.png

ขั้นตอนที่ 1 คือ การเขียน Test case ให้ Fail ซะก่อน มันจะแดงจะอะไรก็ช่าง ขอให้นึกภาพสุดท้ายของการทำงานที่เราต้องการ และเขียนมันออกมา

ขั้นตอนที่ 2 คือ การเขียน Code ขึ้นมา เพื่อให้ผ่าน Test case นั้นได้ จะเขียนแบบไหนก็ได้ขอให้ผลลัพธ์เป็นสิ่งที่ Test case นั้นๆ ต้องการ

ขั้นตอนที่ 3 คือ การ Refactor Code เจ้า Code ที่เราเขียนโดยไม่สนใจว่า Code นั้นจะดีหรือไม่ดี แต่ได้ผลลัพธ์ถูกต้องเมื่อกี้นี้แหละ ให้มันดีและสวยงามซะ

มาเริ่มลง Code จริงกันเลย

ในที่นี้ผมจะใช้ IDE คือ Intellij และจะทำการทดสอบการเขียนโปรแกรมแบบ TDD ในภาษา JAVA Requirement ของโปรแกรมเป็นดังนี้ โปรแกรมต้องการ Input 2 ตัวแล้วจะให้ Output เป็น String พร้อมผลลัพท์ของ Parameter 2 ตัวรวมกัน

getSum(1,1) -> “1+1=2”

ทำการ Create Project ขึ้นมา ซึ่งจะมีสองส่วนคือ ส่วนที่เป็นพื้นที่สำหรับเขียน Test case และส่วนที่เอาไว้สำหรับเขียนโปรแกรมของเรา

หลังจากนั้นเราก็ทำตามขั้นตอนเลยครับ คือเขียน Test ขึ้นมาก่อน ทำการสร้าง Sum2DigitTest.java ขึ้นมา แล้วก็เขียนภาพสุดท้ายที่เราต้องการลงไปครับ ในขั้นตอนแรก สิ่งที่อยากได้คือ เมื่อใส่ Parameter ตัวแรกเป็น 1 ก็ควรจะได้ String ที่เป็น “1” ออกมา เราเขียน Test Case ได้ดังนี้

หลังจากนั้นเราจะทำการสร้าง Class Sum2Digit แล้วสร้าง Constuctor และ getLeft ที่ return ผลลัพท์ที่ Test case ต้องการออกมา โดยย้ำนะครับว่า เขียนแค่ผ่าน

จากนั้นลองมา Run Test ดูครับ

บางคนอ่านมาถึงจุดนี้อาจจะบอกว่า ใช่สิก็มุง return “1” ก็ test ผ่านสิ จริงๆ แล้วขั้นตอนต่อไปคือการ Refactor Code แต่ตอนนี้เราเพิ่งมีแค่ Test case เดียว ดังนั้นเราจะไปเขียน Test case ที่ 2 กันก่อนเพื่อให้เห็นภาพมากยิ่งขึ้น

เอาละได้ Test case ที่ 2 แล้ว คาดหวังเหลือเกินว่า เราใส่ 5 ไป getLeft() มันจะต้องคือ “5” มาให้เรานะ ลอง Run ดูก่อนครับ

จะเห็นว่า Test case ที่ 2 ไม่ผ่าน เพราะ getLeft() ของเรานั้น return แค่ “1” เราก็จัดตามขั้นตอนเดิมเลยครับ คือไปทำยังไงก็ได้ ให้ Test มันผ่านทั้งสอง Test case ย้ำอีกครั้งนะครับว่า เขียนแค่ให้ Result มันถูกในขั้นตอนที่ 2

จะเห็นว่าหน้าตาของโค้ดเรา Test case บังคับให้เปลี่ยนไป แล้วตัว Test case นี่แหละครับ อย่างที่กล่าวไว้ข้างต้น มันคือ Spec ของโปรแกรมเราที่สามารถ Execute ได้ ยอดเยี่ยมมากๆ เลย หลายคนคงจะเห็นภาพสุดท้ายจริงๆ แล้วของ getLeft() ว่ามันควรจะเป็นอย่างไร เมื่อเราทำตามขั้นตอนไปเรื่อยๆ Test -> Code -> Refactor หน้าตาก็ควรจะออกมาประมาณนี้

Test case

Code

Refactor

มาถึงจุดนี้แล้ว เพื่อนๆ น่าจะสามารถเขียน Sum2Digit ต่อได้จนจบ และเริ่มมองเห็นภาพรวมของการเขียนโปรแกรมแบบ TDD กันแล้ว ซึ่งจะเห็นว่ามันมีประโยชน์มาก ในอนาคตอนาคตโปรแกรมเราใหญ่ขึ้น ตราบที่ Test case ยัง Run ผ่าน เราสามารถแก้ Code ได้จนดีที่สุด โดยที่ไม่ต้องกังวลว่า จุดนี้แก้แล้วจะกระทบกับส่วนอื่นหรือเปล่า วันนี้เราอาจมองว่าการเขียนโปรแกรมแบบ TDD นั้นเสียเวลา เราต้องเขียน Code เพิ่มขึ้นถึง 100% เลยทีเดียว แต่ในอนาคตหากเราไม่มี TDD เราอาจจะเสียเวลา 1000% เพราะมีใครมือบอนไปใส่ Hard Code แค่บรรทัดเดียวก็ได้ และ TDD ยังมีท่าอีกมากมายหลายตลบ และคนที่เก่งเรื่อง Design Pattern ก็จะได้ Code หลังจาก Refactor เรียกได้ว่างามสุดๆ กันไปเลยทีเดียว ซึ่งหวังว่าบทความนี้จะพอเป็นประโยชน์ให้เพื่อนๆ ที่เข้ามาอ่าน สามารถนำไปให้ศึกษาต่อเองได้ ขอบคุณครับ

    kidpeterpan

    Written by

    Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
    Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
    Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade