5. Testing & Documentation
หน้าหลัก › โมดูล 5: Testing & Documentation
บทเรียน 5.4

TDD Workflow — Test ก่อน Code

Test-Driven Development คือการเขียน test ก่อนเขียนโค้ด Claude Code ทำ TDD ได้ดีมาก เพราะ test กลายเป็น 'เป้า' ที่มันเขียนโค้ดให้ผ่าน

เมื่อเรียนจบบทนี้ คุณจะ…

  • อธิบายหลักการ TDD ได้
  • บอกขั้นตอนการทำ TDD loop ได้
  • เข้าใจว่าทำไม TDD ถึงเหมาะกับการทำงานของ Claude
TDD: เขียนเทสก่อน (แดง) → เขียนโค้ดให้ผ่าน (เขียว) → ปรับปรุง
TDD: เขียนเทสก่อน (แดง) → เขียนโค้ดให้ผ่าน (เขียว) → ปรับปรุง

TDD คืออะไร? ทำไมต้อง Test ก่อนเขียนโค้ด?

ลองนึกภาพว่าคุณกำลังจะสร้างบ้านสักหลัง คุณคงไม่อยากเริ่มก่ออิฐทันทีโดยไม่มีแบบแปลนใช่ไหมครับ? Test-Driven Development หรือ TDD ก็คล้ายกันครับ มันคือแนวคิดที่บอกว่าเราควร 'เขียนแบบแปลน' หรือ 'เขียน Test' ก่อนที่เราจะเริ่ม 'สร้างโค้ด' จริงๆ

การเขียน Test ก่อนเหมือนกับการที่เราบอกตัวเองและคอมพิวเตอร์ว่า 'นี่คือสิ่งที่เราคาดหวังให้โค้ดทำงานได้' พอเรามีเป้าหมายที่ชัดเจน เราก็จะรู้ว่าต้องเขียนโค้ดแบบไหนให้มันทำงานได้ตามนั้น ซึ่งช่วยลดข้อผิดพลาดและทำให้เราเข้าใจความต้องการของโปรแกรมได้ชัดเจนตั้งแต่แรกเลยครับ

TDD ไม่ใช่แค่การเขียน Test แต่เป็นการคิดและออกแบบไปพร้อมกัน

วงจร TDD Loop: 3 ขั้นตอนง่ายๆ ที่ทำซ้ำได้

TDD มีวงจรการทำงานที่เรียบง่ายแต่ทรงพลัง ที่เรียกว่า 'TDD Loop' ซึ่งมี 3 ขั้นตอนหลักๆ ที่เราจะทำซ้ำไปเรื่อยๆ จนกว่างานจะเสร็จครับ ลองนึกภาพเหมือนไฟจราจร: แดง เขียว และปรับปรุงให้สวยงาม

วงจรนี้ช่วยให้เราพัฒนาโปรแกรมทีละส่วนเล็กๆ ได้อย่างมั่นใจ และรู้ว่าโค้ดของเรายังทำงานได้ถูกต้องเสมอหลังจากที่เราแก้ไขหรือเพิ่มอะไรเข้าไป

  1. ขั้นที่ 1: เขียน Test ให้ล้มเหลว (Red Phase) - เหมือนเราตั้งโจทย์คำถามที่ยังไม่มีคำตอบ แน่นอนว่า Test นี้จะ 'ไม่ผ่าน' (fail) ในตอนแรก เพราะยังไม่มีโค้ดจริงมารองรับครับ
  2. ขั้นที่ 2: เขียนโค้ดให้ Test ผ่าน (Green Phase) - ตอนนี้เราก็เขียนโค้ดเท่าที่จำเป็น เพื่อให้ Test ที่เราเขียนไว้ในขั้นแรก 'ผ่าน' (pass) ให้ได้ครับ ไม่ต้องสนใจเรื่องความสวยงามมากนัก ขอแค่ให้มันทำงานได้ถูกต้องตาม Test ก็พอ
  3. ขั้นที่ 3: ปรับปรุงโค้ดให้สวยงาม (Refactor Phase) - เมื่อ Test ผ่านแล้ว เราก็กลับมาดูโค้ดที่เขียนไปในขั้นที่ 2 เพื่อปรับปรุงให้มันอ่านง่ายขึ้น, ทำงานมีประสิทธิภาพขึ้น หรือจัดระเบียบให้ดีขึ้น โดยที่ Test ทั้งหมดยังคงต้อง 'ผ่าน' อยู่เหมือนเดิมนะครับ
แต่ละรอบของ TDD ควรสั้นและโฟกัสไปที่ฟังก์ชันเล็กๆ เพียงอย่างเดียว

TDD เข้ากันได้ดีกับ Claude Code ได้ยังไง?

Claude Code เป็นผู้ช่วยเขียนโค้ดที่ฉลาดมาก และมันทำงานได้ดีเยี่ยมเมื่อมี 'เป้าหมาย' หรือ 'คำแนะนำ' ที่ชัดเจนให้ทำตามครับ ลองนึกภาพว่าคุณกำลังเล่นเกมที่บอกคะแนนคุณทันทีที่คุณทำอะไรบางอย่างผิดหรือถูก Claude Code ก็ชอบแบบนั้นแหละครับ

Test ที่เราเขียนขึ้นมาใน TDD นี่แหละครับ คือ 'เป้าหมาย' หรือ 'คำแนะนำ' ที่ชัดเจนสำหรับ Claude Code เมื่อเราบอกให้ Claude เขียนโค้ดตามหลัก TDD มันจะเขียนโค้ด, รัน Test ที่เราเตรียมไว้, ถ้า Test ไม่ผ่าน (fail) มันก็จะรู้ทันทีว่าต้องแก้ไขตรงไหน และจะพยายามแก้ไขโค้ดของตัวเองไปเรื่อยๆ จนกว่า Test จะผ่านทั้งหมด นี่คือสิ่งที่เรียกว่า 'agentic loop' ที่ Claude Code ทำได้ดีเป็นพิเศษครับ

Test ที่ดีคือ Test ที่ชัดเจนและเฉพาะเจาะจง ช่วยให้ Claude เข้าใจเป้าหมายได้ง่ายขึ้น

ลองใช้ TDD กับ Claude Code ด้วย Prompt นี้!

เพื่อให้ Claude Code เข้าใจว่าเราอยากทำ TDD เราสามารถใช้ Prompt (คำสั่ง) ที่ชัดเจนเพื่อบอกมันได้เลยครับ Prompt นี้จะบอกให้ Claude เริ่มต้นด้วยการเขียน Test ก่อน แล้วค่อยเขียนโค้ดให้ Test ผ่าน

หัวใจสำคัญคือการอธิบาย 'behavior ที่ต้องการ' ให้ชัดเจนและละเอียดที่สุดเท่าที่จะทำได้ เพื่อให้ Claude เข้าใจว่าคุณต้องการให้โปรแกรมทำอะไรจริงๆ

  1. ขั้นที่ 1: เปิด Claude Code และเตรียมพร้อมสำหรับ Prompt
  2. ขั้นที่ 2: ใช้ Prompt นี้: เราจะทำ TDD: ก่อนอื่นช่วยเขียน test ที่อธิบาย behavior นี้ [อธิบาย behavior ที่ต้องการ] ให้ test fail ก่อน แล้วค่อยเขียนโค้ดให้ผ่าน
  3. ขั้นที่ 3: แทนที่ [อธิบาย behavior ที่ต้องการ] ด้วยรายละเอียดที่คุณต้องการให้โค้ดทำ เช่น 'ฟังก์ชันที่รับตัวเลขสองตัวและคืนค่าผลรวม', 'ฟังก์ชันที่ตรวจสอบว่าอีเมลที่กรอกมาถูกต้องตามรูปแบบหรือไม่' เป็นต้น
ยิ่งอธิบาย behavior ชัดเจนเท่าไหร่ Claude ก็ยิ่งเขียน Test และ Code ได้ตรงใจเท่านั้น

TDD เหมาะกับงานแบบไหน?

TDD เป็นเทคนิคที่ยอดเยี่ยมสำหรับงานที่มี 'กฎ' หรือ 'เงื่อนไข' ที่ชัดเจนมากๆ ครับ ลองนึกถึงสถานการณ์ที่คุณรู้ผลลัพธ์ที่แน่นอนเมื่อมีข้อมูลนำเข้าแบบใดแบบหนึ่ง

ตัวอย่างเช่น ถ้าคุณกำลังเขียนโค้ดสำหรับ: 1. การคำนวณต่างๆ (เช่น คำนวณภาษี, คำนวณส่วนลด), 2. การตรวจสอบข้อมูล (เช่น ตรวจสอบรูปแบบอีเมล, ตรวจสอบรหัสผ่านว่ามีความยาวพอไหม), หรือ 3. กฎทางธุรกิจ (เช่น กฎการให้คะแนนสะสม, กฎการอนุมัติสินเชื่อ) งานเหล่านี้มีกฎที่ตายตัวและผลลัพธ์ที่คาดเดาได้ ทำให้ TDD ช่วยให้คุณมั่นใจได้ว่าโค้ดของคุณทำงานได้อย่างถูกต้องตามที่คาดหวังทุกประการครับ

ถ้า logic มีความซับซ้อนและมีเงื่อนไขเยอะๆ TDD จะช่วยให้คุณมั่นใจในผลลัพธ์มากขึ้น
ลองใช้ Prompt นี้กับ Claude
เราจะทำ TDD: ก่อนอื่นช่วยเขียน test ที่อธิบาย behavior นี้ [อธิบาย] ให้ test fail ก่อน แล้วค่อยเขียนโค้ดให้ผ่าน
เคล็ดลับ: TDD เหมาะมากกับ logic ที่กฎชัดเจน เช่น การคำนวณ, validation, business rule
สรุปบทนี้
  • เขียน test ก่อน → code → refactor
  • test = เป้าให้ Claude เขียนโค้ดให้ผ่าน
  • เหมาะกับ logic ที่กฎชัด
แบบทดสอบท้ายบท
ลองตอบดู แล้วระบบจะเฉลยให้ทันที
ข้อ 1.TDD คืออะไร?
เฉลย: TDD คือการเขียน test เพื่อบอกว่าโปรแกรมควรทำงานอย่างไร ก่อนที่เราจะเริ่มเขียนโค้ดจริง
ข้อ 2.ทำไม TDD ถึงช่วยให้ Claude เขียนโค้ดได้ดี?
เฉลย: Test ที่เราเขียนไว้เป็นเหมือนโจทย์หรือเป้าหมายที่ชัดเจน ทำให้ Claude รู้ว่าต้องเขียนโค้ดแบบไหนถึงจะถูกต้องและผ่าน test