Quantcast
Channel: cc :: somkiat
Viewing all articles
Browse latest Browse all 2036

TDD :: เริ่มเขียนด้วย Failing test หมายถึงอะไร ? ทำไปทำไม ?

$
0
0

Failed test or exam and disappointed woman

[caption id="attachment_9259" align="alignnone" width="713"]Failed test or exam and disappointed woman Failed test or exam and disappointed woman[/caption] คำถามที่น่าสนใจเกี่ยวกับ Test-Driven Development (TDD)
  • การเริ่มเขียนด้วย Failing test หมายถึงอะไร ?
  • ทำไมต้องเริ่มด้วย Failing test ด้วย ?
ลองมาหาคำตอบให้ตัวเองกันหน่อยไหม ? แน่นอนว่า เป็นวิธีการที่ต้องทำให้เราคิดก่อนว่า (Think before Act) เรากำลังจะทำอะไร เรากำลังจะแก้ไขสิ่งใด นั่นคือ เรารู้ และ ควบคุมตัวเราเองว่า กำลังทำอะไรอยู่ และในเวลาหนึ่ง ๆ ควรทำ หรือ แก้ไขปัญหาเพียงปัญหาเดียวเท่านั้น

ในการพัฒนา software ส่วนใหญ่มักจะมีขั้นตอนการทำงานดังนี้

  1. ทำการอ่าน และ เขียนความต้องการขึ้นมา บางครั้งอาจจะเรียกว่า เป็นความเพ้อฝัน
  2. ทำการเขียน code เพื่อให้ได้ตามสิ่งที่ต้องการ
  3. ทำการทดสอบ code เหล่านั้นว่าตรงตามที่ต้องการหรือไม่
ประเด็นที่สำคัญคือ กว่าเราจะรู้ว่า code ที่เขียนขึ้นมานั้น มันทำงานถูกต้องหรือไม่ ? มันส่งผลกระทบอะไรหรือไม่ ? ต้องใช้เวลาที่ยาวนานมาก ๆ เช่น เป็นเดือน เป็นปี !! ซึ่งเป็นปัญหาหลักของการพัฒนา software เลย

ดังนั้นเราจึงต้องการวิธีการที่ทำให้รู้ผลกระทบจากการเปลี่ยนแปลงให้เร็วที่สุด ?

เช่น
  • เมื่อแต่ละ 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
และทำแบบนี้ไปเรื่อย ๆ จนกว่า code ของการตรวจสอบ email เป็น code ที่เรามั่นใจ และ แก้ไขปัญหาต่าง ๆ ได้ครบ หรือทำไปจนกว่า ไม่สามารถคิด test case อื่น ๆ ได้อีกต่อไปแล้ว และการทำงานของ test case ทั้งหมดต้องผ่านด้วยนะครับ

สังเกตุไหมว่า พฤติกรรมของการพัฒนาระบบเป็นอย่างไร ?

เราทำการทดสอบในแต่ละ test case เราทำการทดสอบในทุก ๆ test case นั่นคือ เรารู้เสมอว่า code ที่เราเขียนขึ้นมานั้น ทำงานถูกต้องตามที่ต้องการหรือไม่ และที่สำคัญมีการทำ regression testing อยู่เสมอ เพื่อทำให้เรามั่นใจว่า code ที่เขียนขึ้นมา มันไม่ส่งผลกระทบต่อส่วนการทำงานอื่น ๆ นะ
สิ่งที่เห็นได้ชัดเจนก็คือ ในแต่ละ test case มันทำให้เกิด code ชุดเล็ก ๆ ขึ้นมาเรื่อย ๆ และสุดท้ายจะทำให้ได้ code ที่แก้ไขปัญหาทั้งหมดของเรา
เมื่อเราไม่รู้จะเขียน test case อะไรต่อไป หรือคิด test case ไม่ออกแล้ว กลับมาปรับปรุง code ให้ดีขึ้นกว่าเดิม (Refactoring) สุดท้ายแล้วก็เป็นอันว่า งานเสร็จสิ้นแล้ว !!!
ซึ่งมันเป็นวิธีการพัฒนาระบบงานที่เรียบง่ายมาก ๆ แต่นักพัฒนาส่วนใหญ่ไม่ทำกัน และมักจะทำตรงกันข้ามเสมอ มันแปลกดีนะ !!

Viewing all articles
Browse latest Browse all 2036

Trending Articles