Failed test or exam and disappointed woman

Failed test or exam and disappointed woman

คำถามที่น่าสนใจเกี่ยวกับ 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)
สุดท้ายแล้วก็เป็นอันว่า งานเสร็จสิ้นแล้ว !!!

ซึ่งมันเป็นวิธีการพัฒนาระบบงานที่เรียบง่ายมาก ๆ
แต่นักพัฒนาส่วนใหญ่ไม่ทำกัน
และมักจะทำตรงกันข้ามเสมอ

มันแปลกดีนะ !!

Tags: