คุณตื่นเต้นกับแอปที่สร้าง แต่มีปัญหาหนึ่ง - ไม่มี tests เลย อยากเขียนแบบ TDD แตไม่อรู้จักเริ่มที่ไหน ค้างอยู่ จากแอปไม่มี tests ไปสู่การเขียนแอปแบบ TDD ทำยังไง?
ทดสอบโค้ดที่มีอยู่แล้ว
คุณมีโค้ดเยอะไม่มี tests แต่นั่นไม่แปลว่าไม่เขียน tests ตอนนี้ ได้ ให้เริ่มทดสอบโค้ดที่มีอยู่ เพื่อให้แน่ใจว่าโค้ดทำงานเหมือนคุณคาดหวัง
มันไม่ใช่ TDD แต่การทดสอบโค้ดเดิมจะช่วย เรียนรู้ TDD:
-
ฝึกคิด edge cases และ error conditions
เขียน tests โดยไม่ใช้ปีทดสอบทุก input ต้องคิดว่าโค้ดแตกง่ายที่ไหน เมธอดรับ string ส่ง symbol แล้วไง? ส่ง
nilแล้วไง? ทดสอบฟังก์ชันหาร ต้องทดสอบด้วย 0 แต่น่าจะไม่ต้องทดสอบ 1 และ 2เขียน tests พอสมควร จะเริ่มทายได้ว่าเมธอดไหนแตกง่าย และตอน TDD จะใช้ skill นี้เขียน tests มั่นคงบังคับโค้ดจัดการ edge cases ได้ดี
-
ฝึกเขียน tests ที่มีโครงสร้างดี
เขียน tests after-the-fact ลอง patterns ต่างๆ โค้ดที่ทดสอบอยู่แล้ว โฟกัสที่ test และโครงสร้าง และเรียนรู้ patterns ดีๆ จะเขียน tests ดีตอน ไม่มี โค้ดพิง
-
ค้นพบสิ่งที่ทำให้โค้ดยากต่อการทดสอบ
เขียน tests มากขึ้น จะเริ่มรู้สึกพื้นที่ไหนของระบบยากต่อการทดสอบ ตอนสังเกต ไฮไลต์ว่าเป็นพื้นที่ต้อง refactor และดีกว่านั้น จะเริ่มเขียนโค้ดที่ทดสอบง่ายครั้งแรก
รู้จัก easy-to-test code แล้ว จะ TDD easy-to-test APIs ด้วยความรู้นั้น และช่วยสร้างแอปเร็วขึ้น
滑入 TDD
ใช้ test-after สร้าง skills ช่วย เรียนรู้ TDD แตยังอยาก TDD ส่วนของแอปในที่สุด มีวิธีง่าย滑入 TDD และยังพึ่งโค้ดเดิม: เขียน regression tests
Regression tests กันการพังของโค้ดที่แก้แล้ว แนวคิดง่าย: เวลารู้บั๊ก แทนที่จะคลิกใน browser reproduce:
- เขียน failing test reproduce บั๊ก
- รัน tests ให้แน่ใจว่า fail (เพราะบั๊กยังอยู่)
- แก้บั๊ก แบบง่ายที่สุด
- รัน tests ให้แน่ใจว่า pass
- Refactor fix ถ้าจำเป็น
ง่ายกว่า TDD ระบบใหม่จากศูนย์ เพราะแค่ test-drive การเปลี่ยนแปลงโค้ดที่มีอยู่ สร้าง habit "Red, Green, Refactor" วงจรสำคัญของ TDD และจากนี้ TDD ใกล้กว่าพยายามไป TDD โดยตรงจาก no tests
จากไม่มีอะไร สู่ TDD
แอปไม่มี tests ไม่ใช่ที่เริ่มต้นแย่ ตอนทดสอบโค้ดเดิม จะเรียนรู้มากสำหรับ TDD tests ที่ดี Test-after ง่ายกว่า TDD ตอนแรก เพราะไม่ต้องจินตนาการ APIs ที่ยังไม่รู้ design และตอนตัดสินใจนำ TDD เข้าแอป สามารถ滑入ได้ด้วย regression tests
ดังนั้น ถ้าไม่รู้จะ TDD ระบบที่จินตนาการ ให้เขียน tests ต่อไป แม้ต้องเขียนโค้ดก่อนก็ตาม