TDD ย่อมาจาก Test Driven Development หมายถึง กระบวนการพัฒนาซอฟต์แวร์ที่ขับเคลื่อนด้วยการทดสอบ เน้นการเขียน Test ก่อนที่จะเขียน Code โดยทำตาม 3 ขั้นตอนหลัก ดังนี้
- เขียน Test: เขียนกรณีทดสอบ (Test Case) เพื่อระบุพฤติกรรมที่คาดหวังของซอฟต์แวร์
- รัน Test: รัน Test ที่เขียนไว้ ตรวจสอบว่า Test ทั้งหมด ล้มเหลว
- เขียน Code: เขียน Code ที่น้อยที่สุดเท่าที่จำเป็นเพื่อให้ Test ทั้งหมด ผ่าน
ทำซ้ำ 3 ขั้นตอนนี้วนไปจนกว่าจะพัฒนาซอฟต์แวร์เสร็จสมบูรณ์
ถ้าหากเรา search google ด้วย keyword tdd
เราจะคุ้นชินกับภาพนี้
ซึ่งมันใช้ในการ อธิบายการเขียนโปรแกรมโดยการใช้ TDD แต่ภาพนี้มันยังอธิบายวิธีการเขียนได้ไม่ละเอียดเท่าไหร่ ภาพที่ควรจะเป็นต้องเป็นแบบนี้
กำหนด Goal ในการทดสอบ
เริ่มต้นที่เราต้องรู้ก่อนว่า เราจะทดสอบอะไร นั่นแปลว่า ก่อนที่เราจะเริ่มเขียน Test ได้นั้น เราจะต้องมี case ที่จะทดสอบก่อน พร้อม data ที่จะใช้ทดสอบ ตรงนี้ถ้าเป็นไปได้ข้อมูลต้องใกล้เคียงของจริงให้ได้มากที่สุดเพื่อให้มั่นใจได้ว่ามันสามารถทำงานได้ถูกต้อง
เขียน Test Case และ Run Test
ต่อมาเริ่มต้นเขียน Test Case ที่จะทดสอบ โดยแนะนำว่าใน 1 การทดสอบนั้นพยายามโฟกัสไปที่การทดสอบเพียงเรื่องเดียว อย่าเอาหลายๆ การทดสอบมาไว้ใน test เดียวกัน เพื่อให้ง่ายต่อการ scope หากเกิดข้อผิดพลาดขึ้น
เมื่อเราเขียน test เสร็จแล้ว ก็ให้ลอง run test ก่อน เพื่อเช็คให้แน่ใจว่า test ที่เราเขียนขึ้นมานั้น มัน error ตรงไหนบ้าง ส่วนใหญ่จังหวะนี้ ถ้าเราเขียนการทดสอบตัวแรก เรามักจะข้ามกันในครั้งแรก เพราะว่ามันเห็นๆ กันอยู่แล้วว่า มัน error แน่ๆ เพราะยังไม่ได้เขียน production code เลย
ซึ่งจริงๆ แล้ว วัตถุประสงค์ของมัน คือ เราต้องการให้แน่ใจว่า การทดสอบที่เพิ่มเข้าไปใหม่นั้นข มันไม่มีผลกระทบต่อชุดการทดสอบที่มีอยู่แล้ว เพราะเราไม่สามารถรู้ได้ว่ามันจะกระทบกับ code ส่วนอื่นหรือเปล่า จนกว่าจะ run ทดสอบมัน
เขียน Production Code
เมื่อเรารู้แล้วว่า test ที่เราเขียนนั้น มันเกิด error ตรงไหนบ้างแล้ว ก็ให้เราแก้ไขมันและ run ทดสอบมันอีกครั้งนึง เพื่อให้รู้ว่า code ที่เราเขียนเข้าไปนั้นมันสามารถทำงานได้อย่างถูกต้อง
ในขั้นตอนนี้เราควรที่จะทำทีละเล็กละน้อย และ คิดให้ง่าย (Think a simple) เข้าไว้ เพื่อ scope ปัญหาให้เล็กที่สุด เพื่อให้เรารู้และเข้าใจปัญหาที่ต้องแก้ มันจะช่วยให้เราเขียน code ได้ง่ายและเร็วขึ้น
ไม่ต้องกังวลว่า เราจะเขียน code ได้แย่ หรือตรงไปตรงมาเกินไป เพราะยังไงเดียวเราก็ refactor มันอีกครั้งอยู่ดี
Run Test ทั้งหมด
แน่นอนว่า เมื่อเรา run ชุดการทดสอบ ชุดที่เราโฟกัสอยู่จนผ่านแล้ว (กรณีที่เวลาทำงานเรา run เฉพาะการทดสอบแค่ไฟล์เดียว หรือ test case เดียว) เราต้อง run ทดสอบทั้งหมดอีกครั้งหนึ่ง เพื่อให้แน่ใจว่า code ที่เขียนพึ่งเพิ่มเข้าไปนั้น มันจะไม่กระทบการทำงานในส่วนอื่นๆ
Refactor Code
หลังจากที่เรามั่นใจแล้วว่า code ที่เราเขียนขึ้นมานั้นสามารถทำงานได้ และไม่กระทบการทำงานอื่นๆ แล้ว ก็มาถึงจังหวะที่เราต้อง clean code หรือ refactor มัน
โดยในขั้นตอนนี้เราจะดูว่า code ที่เราเขียนนั้น มันสามารถเขียนให้ดีขึ้น หรือ สะอาดขึ้นได้กว่านี้หรือเปล่า ถ้าทำได้ ก็ให้ลงมือ refactor มันให้เรียบร้อย
ในขึ้นตอนนี้ จาก code ที่เราเขียนแบบง่ายๆ (Simple) เพื่อแก้ปัญหาเฉพาะงานหรือเงื่อนไข ก็จะถูกรวมเข้ามาเป็น code ที่สามารถแก้ปัญหาหลายๆ งานหรือเงื่อนไขได้
และแน่นอนว่า เมื่อมีการแก้ไข code เราก็ต้องทำการ run ทดสอบใหม่ทั้งหมด เพื่อให้แน่ใจว่า code ที่เราพึ่งแก้ไขไปนั้น ยังสามารถทำงานเดิมได้อยู่ และไม่กระทบการทำงานในส่วนอื่นๆ
หยิบ Test Case ใหม่ เพื่อเขียน Test
สุดท้าย เมื่อเราผ่านการ refactor code เรียบร้อยแล้ว ก็ไปหยิบ Test Case ถัดไปมาทำงานต่อ ซึ่งมันก็จะวนเข้า Loop TDD ต่อไปอย่างนี้จนเสร็จ
ทั้งหมดนี้เป็น Step ในการเขียน code โดยนำเอาแนวคิดของ TDD เข้ามาใช้งานร่วมกัน ต่อไปเราจะมาเข้าเรื่องหลักของบทความนี้กัน