[caption id="attachment_9259" align="alignnone" width="713"] Failed test or exam and disappointed woman[/caption]
คำถามที่น่าสนใจเกี่ยวกับ Test-Driven Development (TDD)
- การเริ่มเขียนด้วย Failing test หมายถึงอะไร ?
- ทำไมต้องเริ่มด้วย Failing test ด้วย ?
ในการพัฒนา software ส่วนใหญ่มักจะมีขั้นตอนการทำงานดังนี้
- ทำการอ่าน และ เขียนความต้องการขึ้นมา บางครั้งอาจจะเรียกว่า เป็นความเพ้อฝัน
- ทำการเขียน code เพื่อให้ได้ตามสิ่งที่ต้องการ
- ทำการทดสอบ code เหล่านั้นว่าตรงตามที่ต้องการหรือไม่
ดังนั้นเราจึงต้องการวิธีการที่ทำให้รู้ผลกระทบจากการเปลี่ยนแปลงให้เร็วที่สุด ?
เช่น- เมื่อแต่ละ feature เสร็จ
- เมื่อแต่ละ class เสร็จ
- เมื่อแต่ละ function/method เสร็จ
- เมื่อแต่ละบรรทัดของ code เสร็จ
ตัวอย่างการเขียนระบบตรวจสอบรูปแบบของ email
แน่นอนว่า ก่อนที่จะเริ่มพัฒนา สิ่งที่คุณต้องรู้คือ ความต้องการของสิ่งนั้น จากตัวอย่างคือ การตรวจสอบรูปแบบของ email ดังนั้นสิ่งที่ต้องรู้คือ email ที่ถูกต้อง และ ไม่ถูกต้องเป็นอย่างไร จากนั้นต้องมีตัวอย่างของข้อมูลในแต่ละกรณีอีกด้วย มาถึงตรงนี้สิ่งที่เราต้องได้ก็คือ test case ต่าง ๆ แต่ละ test case ประกอบไปด้วย requirement หรือ business requirement และ ข้อมูลตัวอย่างในการทดสอบเสมอ จากนั้นมาเริ่มขั้นตอนการเขียน code ดีกว่า ซึ่งมีลำดับความคิดที่แตกต่างกันไป แล้วแต่คนนะครับ แต่ล้วนมีเป้าหมายเดียวกัน ซึ่งผมจะทำการเขียน code ด้วยแนวคิดดังนี้- Email ไม่ถูกต้อง ถ้า email เป็นค่า NULL ผลการทำงานจาก function นี้คือ FALSE
- Email ไม่ถูกต้อง ถ้า email เป็นค่าว่าง ผลการทำงานจาก function นี้คือ FALSE
- Email ไม่ถูกต้อง ถ้า email ไม่มี @ เช่น somkiat-gmail.com ผลการทำงานจาก function นี้คือ FALSE
- Email ถูกต้อง เช่น somkiat@gmail.com ซึ่งต้องทำการเขียน code เพื่อหาว่า email มี @ จริง ๆ นะ ผลการทำงานจาก function นี้คือ TRUE
- Email ไม่ถูกต้อง ถ้า email มี domain name ที่ไม่ถูกต้อง เช่น somkiat@gmail.comx ผลการทำงานจาก function นี้คือ FALSE
- Email ไม่ถูกต้อง ถ้า email มี domain name ที่ไม่มีอยู่จริง เช่น somkiat@gmaillll.com ผลการทำงานจาก function นี้คือ FALSE
สังเกตุไหมว่า พฤติกรรมของการพัฒนาระบบเป็นอย่างไร ?
เราทำการทดสอบในแต่ละ test case เราทำการทดสอบในทุก ๆ test case นั่นคือ เรารู้เสมอว่า code ที่เราเขียนขึ้นมานั้น ทำงานถูกต้องตามที่ต้องการหรือไม่ และที่สำคัญมีการทำ regression testing อยู่เสมอ เพื่อทำให้เรามั่นใจว่า code ที่เขียนขึ้นมา มันไม่ส่งผลกระทบต่อส่วนการทำงานอื่น ๆ นะสิ่งที่เห็นได้ชัดเจนก็คือ ในแต่ละ test case มันทำให้เกิด code ชุดเล็ก ๆ ขึ้นมาเรื่อย ๆ และสุดท้ายจะทำให้ได้ code ที่แก้ไขปัญหาทั้งหมดของเราเมื่อเราไม่รู้จะเขียน test case อะไรต่อไป หรือคิด test case ไม่ออกแล้ว กลับมาปรับปรุง code ให้ดีขึ้นกว่าเดิม (Refactoring) สุดท้ายแล้วก็เป็นอันว่า งานเสร็จสิ้นแล้ว !!!
ซึ่งมันเป็นวิธีการพัฒนาระบบงานที่เรียบง่ายมาก ๆ แต่นักพัฒนาส่วนใหญ่ไม่ทำกัน และมักจะทำตรงกันข้ามเสมอ มันแปลกดีนะ !!