TDD ย่อมาจาก Test Driven Development หมายถึง กระบวนการพัฒนาซอฟต์แวร์ที่ขับเคลื่อนด้วยการทดสอบ เน้นการเขียน Test ก่อนที่จะเขียน Code โดยทำตาม 3 ขั้นตอนหลัก ดังนี้

  1. เขียน Test: เขียนกรณีทดสอบ (Test Case) เพื่อระบุพฤติกรรมที่คาดหวังของซอฟต์แวร์
  2. รัน Test: รัน Test ที่เขียนไว้ ตรวจสอบว่า Test ทั้งหมด ล้มเหลว
  3. เขียน Code: เขียน Code ที่น้อยที่สุดเท่าที่จำเป็นเพื่อให้ Test ทั้งหมด ผ่าน

ทำซ้ำ 3 ขั้นตอนนี้วนไปจนกว่าจะพัฒนาซอฟต์แวร์เสร็จสมบูรณ์

ถ้าหากเรา search google ด้วย keyword tdd เราจะคุ้นชินกับภาพนี้

TDD Cycle

ซึ่งมันใช้ในการ อธิบายการเขียนโปรแกรมโดยการใช้ TDD แต่ภาพนี้มันยังอธิบายวิธีการเขียนได้ไม่ละเอียดเท่าไหร่ ภาพที่ควรจะเป็นต้องเป็นแบบนี้

How TDD Works

กำหนด 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 เข้ามาใช้งานร่วมกัน ต่อไปเราจะมาเข้าเรื่องหลักของบทความนี้กัน