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

Generate Unit Tests

ให้ Claude เขียน unit test ให้โค้ดที่มีอยู่ ช่วยเพิ่ม coverage และจับ bug ก่อนถึงมือผู้ใช้ โดยคุณแทบไม่ต้องเขียนเอง

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

  • เขียนคำสั่ง (prompt) ให้ Claude สร้าง unit test ได้
  • ระบุ framework ที่เหมาะสมสำหรับ unit test ได้
  • ตรวจสอบและปรับปรุง coverage ของ unit test ได้
ให้ Claude สร้าง unit test ครอบคลุมฟังก์ชัน
ให้ Claude สร้าง unit test ครอบคลุมฟังก์ชัน

ทำไมต้องเขียน Unit Test? (และ Claude ช่วยได้ยังไง)

ลองนึกภาพว่าคุณกำลังทำอาหารจานพิเศษ แต่ก่อนจะเสิร์ฟให้ลูกค้า คุณก็ต้องชิมก่อนใช่ไหมครับ? Unit Test ก็เหมือนกับการ 'ชิม' โค้ดของเราทีละส่วนเล็ก ๆ (เช่น ฟังก์ชัน หรือเมธอด) เพื่อให้แน่ใจว่าแต่ละส่วนทำงานถูกต้องตามที่เราคาดหวัง ก่อนที่จะนำไปรวมกันเป็นโปรแกรมใหญ่ ๆ ครับ

การทำแบบนี้ช่วยให้เราเจอข้อผิดพลาด (bug) ได้ตั้งแต่เนิ่น ๆ และแก้ไขได้ง่ายกว่าปล่อยให้ไปเจอตอนที่โปรแกรมใหญ่ ๆ ทำงานไปแล้ว ซึ่งอาจจะซับซ้อนและหายากกว่ามากครับ และที่เจ๋งคือ Claude สามารถช่วยเขียน 'คนชิม' หรือ Test เหล่านี้ให้เราได้แทบทั้งหมด ทำให้เราประหยัดเวลาและมั่นใจในคุณภาพโค้ดมากขึ้นเยอะเลย!

Unit Test ช่วยประหยัดเวลาและลดความเครียดในการหา Bug ในระยะยาว

เตรียมตัวก่อนขอ Claude ช่วยเขียน Unit Test

ก่อนที่เราจะขอให้ Claude ช่วยเขียน Unit Test สิ่งสำคัญคือเราต้องมี 'โค้ด' ที่เราอยากจะทดสอบก่อนครับ เช่น ฟังก์ชันคำนวณอะไรสักอย่าง หรือคลาสที่จัดการข้อมูลบางอย่าง และนอกจากโค้ดแล้ว เรายังต้องรู้ด้วยว่าเราจะใช้ 'เครื่องมือ' อะไรในการทดสอบโค้ดของเรา

เครื่องมือเหล่านี้เราเรียกว่า Test Framework ครับ ซึ่งมีหลายแบบขึ้นอยู่กับภาษาโปรแกรมที่คุณใช้ เช่น ถ้าเขียน JavaScript ก็อาจจะเป็น Jest หรือ Vitest ถ้าเป็น Python ก็อาจจะเป็น Pytest การบอก Claude ให้ชัดเจนว่าเราใช้ Framework อะไร จะช่วยให้ Claude สร้าง Test ที่ถูกต้องและใช้งานได้จริงกับโปรเจกต์ของเราครับ

รู้โค้ดที่จะเทสต์ และรู้ Test Framework ที่ใช้ คือกุญแจสำคัญ

บอก Claude ให้ชัดเจนว่าต้องการ Test แบบไหน

เวลาที่เราขอให้ Claude เขียน Test เราไม่ควรถามแค่ว่า 'ช่วยเขียน Test ให้หน่อย' ครับ เหมือนเราไปสั่งอาหารแล้วบอกแค่ว่า 'เอาอาหารหน่อย' เชฟก็ไม่รู้จะทำอะไรให้ใช่ไหมครับ? เราต้องบอกให้ชัดเจนว่าต้องการอะไรบ้าง

สิ่งที่สำคัญคือการบอก Claude ว่า Test ที่ต้องการนั้นควรครอบคลุมสถานการณ์แบบไหนบ้าง: 1. Happy Path: สถานการณ์ปกติที่ทุกอย่างเป็นไปตามที่คาดหวัง เช่น ฟังก์ชันบวกเลข 1 + 1 ได้ 2. 2. Edge Case: สถานการณ์พิเศษที่อาจจะเกิดขึ้นไม่บ่อย แต่ก็เป็นไปได้ เช่น ฟังก์ชันบวกเลขที่มีค่าเป็นศูนย์ หรือค่าติดลบ. 3. Error Case: สถานการณ์ที่ผิดพลาดหรือข้อมูลไม่ถูกต้อง เช่น ฟังก์ชันบวกเลข แต่ดันส่งตัวอักษรเข้าไปแทนตัวเลข

การบอกครบทั้งสามแบบนี้จะช่วยให้ Test ของเราแข็งแรงและครอบคลุมทุกมุมมองครับ

Test ที่ดีต้องครอบคลุมทั้ง Happy, Edge, และ Error Case

ตัวอย่าง Prompt ที่ใช้ขอ Unit Test จาก Claude

เพื่อให้ Claude ทำงานได้ตรงจุดที่สุด เราควรใช้ Prompt ที่ละเอียดและชัดเจนครับ ลองใช้ Prompt ตัวอย่างนี้ดู แล้วปรับให้เข้ากับโค้ดและ Framework ของคุณ

Prompt นี้จะบอก Claude ว่า: 1. ช่วยเขียน Unit Test ให้ฟังก์ชันที่กำหนด. 2. ใช้ Test Framework อะไร (เช่น Jest). 3. Test ต้องครอบคลุมทั้งสถานการณ์ปกติ (Happy Path), สถานการณ์พิเศษ (Edge Case), และสถานการณ์ที่เกิดข้อผิดพลาด (Error Case). 4. และสุดท้ายคือขอให้ Test นั้น 'รันผ่าน' ด้วยนะ

  1. คัดลอกโค้ดฟังก์ชันที่คุณต้องการให้ Claude ช่วยเขียน Test (เช่น ฟังก์ชัน calculatePrice)
  2. วางโค้ดนั้นลงในพื้นที่สนทนาของ Claude
  3. ใช้ Prompt ตัวอย่างนี้และปรับเปลี่ยน [Jest/Vitest/Pytest] ให้ตรงกับ Framework ของคุณ: ช่วยเขียน unit test ให้ฟังก์ชันนี้ด้วย [Jest/Vitest/Pytest] ครอบคลุมทั้ง happy path, edge case, และ error case แล้วรัน test ให้ผ่านด้วย
อย่าลืมเปลี่ยน [Jest/Vitest/Pytest] ให้เป็นชื่อ Framework ที่คุณใช้จริง!

ใช้ Coverage Report หาจุดที่ต้อง Test เพิ่มเติม

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

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

บางครั้ง Claude ก็สามารถรัน Test และแสดง Report ได้เลย (ขึ้นอยู่กับความสามารถของ Claude ในแต่ละแพลตฟอร์ม) แต่ถ้าไม่ ก็ไม่เป็นไร เราสามารถรัน Test ในเครื่องของเรา แล้วเอาผล Coverage Report มาบอก Claude ได้ครับ

  1. หลังจาก Claude สร้าง Test ให้แล้ว ให้คุณลองรัน Test เหล่านั้นในโปรเจกต์ของคุณ
  2. หากเครื่องมือ Test Framework ของคุณสามารถสร้าง Coverage Report ได้ (มักจะมีคำสั่งเช่น npm test -- --coverage หรือ pytest --cov) ให้รันคำสั่งเพื่อดู Report
  3. หากพบส่วนที่ Coverage ยังน้อย (เช่น ฟังก์ชันบางตัวยังไม่ถูกทดสอบ) ให้คัดลอกส่วนโค้ดนั้น หรือแจ้ง Claude ว่า 'ช่วยเขียน Test เพิ่มเติมสำหรับส่วนที่ยังไม่ครอบคลุมนี้ด้วย'
เป้าหมายไม่ใช่แค่ 100% Coverage เสมอไป แต่คือการมั่นใจว่าโค้ดสำคัญถูกทดสอบอย่างดี

เคล็ดลับ: Test ที่ดีคือคู่มือการใช้งานโค้ด

มีคำกล่าวว่า 'Test ที่ดีคือ Documentation ที่ดี' ครับ หมายความว่า Test ที่เราเขียน (หรือให้ Claude เขียน) ควรอ่านแล้วเข้าใจได้ทันทีว่าโค้ดส่วนนั้น ๆ ทำงานอย่างไร มี input แบบไหน และให้ output เป็นอะไร

ลองจินตนาการว่ามีเพื่อนร่วมงานมาดูโค้ดของคุณ เขาควรอ่าน Test แล้วเข้าใจได้เลยว่าฟังก์ชันนี้มีหน้าที่อะไรและใช้งานยังไง โดยไม่ต้องไปไล่อ่านโค้ดจริงทั้งหมด การที่ Claude สร้าง Test ที่ 'อ่านแล้วเข้าใจ requirement' ได้ จะช่วยให้โค้ดของคุณดูแลรักษาง่ายขึ้นมากในระยะยาวครับ

ลองอ่าน Test ที่ Claude สร้างให้ เพื่อดูว่ามันเข้าใจง่ายเหมือนคู่มือไหม
ลองใช้ Prompt นี้กับ Claude
ช่วยเขียน unit test ให้ฟังก์ชันนี้ด้วย [Jest/Vitest/Pytest] ครอบคลุมทั้ง happy path, edge case, และ error case แล้วรัน test ให้ผ่านด้วย
เคล็ดลับ: ขอให้เขียน test ที่ 'อ่านแล้วเข้าใจ requirement' — test ที่ดีคือ documentation อย่างหนึ่ง
สรุปบทนี้
  • ระบุ test framework
  • ครอบคลุม edge + error case ไม่ใช่แค่ happy
  • ใช้ coverage หาจุดที่ขาด
แบบทดสอบท้ายบท
ลองตอบดู แล้วระบบจะเฉลยให้ทันที
ข้อ 1.เวลาจะให้ Claude ช่วยเขียน unit test เราควรบอกอะไร Claude บ้าง?
เฉลย: การบอกชื่อ framework และให้ครอบคลุม edge case จะช่วยให้ Claude สร้าง test ที่มีคุณภาพและใช้งานได้จริง
ข้อ 2.ทำไมเราถึงควรให้ Claude ช่วยเขียน unit test ที่ครอบคลุมทั้ง happy path, edge case, และ error case?
เฉลย: Test ที่ดีจะช่วยจับข้อผิดพลาดได้ตั้งแต่เนิ่นๆ ทำให้โค้ดมีคุณภาพและเชื่อถือได้มากขึ้น