ฉันทำถูกไหม? ถ้าไม่ใช่สิ่งที่ฉันต้องเปลี่ยนแน่นอน
เป็นการยากที่จะพูดจากคำอธิบายสั้น ๆ แต่ฉันสงสัยว่าไม่ใช่คุณไม่ทำถูกต้อง หมายเหตุ: ฉันไม่ได้บอกว่าสิ่งที่คุณกำลังทำไม่ได้ผลหรือไม่ดี แต่คุณไม่ได้ทำ TDD ตรงกลาง "D" หมายถึง "ขับเคลื่อน" การทดสอบไดรฟ์ทุกอย่างกระบวนการพัฒนารหัสการออกแบบสถาปัตยกรรมทุกอย่าง
การทดสอบจะบอกคุณว่าต้องเขียนเมื่อใดที่จะเขียนสิ่งที่จะเขียนต่อไปเมื่อจะหยุดเขียน พวกเขาบอกคุณถึงการออกแบบและสถาปัตยกรรม (การออกแบบและสถาปัตยกรรมเกิดจากรหัสผ่านการปรับโครงสร้างใหม่) TDD ไม่ได้เกี่ยวกับการทดสอบ มันไม่ได้เกี่ยวกับการเขียนการทดสอบก่อน: TDD นั้นเกี่ยวกับการให้การทดสอบช่วยให้คุณเขียนได้ก่อนเป็นเพียงสิ่งที่จำเป็นสำหรับสิ่งนั้น
ไม่สำคัญว่าคุณจะเขียนรหัสลงจริงหรือเอาออกมาอย่างสมบูรณ์: คุณกำลังเขียนโค้ด (โครงกระดูก) ในหัวของคุณแล้วเขียนการทดสอบสำหรับรหัสนั้น นั่นไม่ใช่ TDD
ให้ไปของนิสัยที่เป็นเรื่องยาก ยากมากจริงๆ ดูเหมือนจะยากเป็นพิเศษสำหรับโปรแกรมเมอร์ที่มีประสบการณ์
คี ธ Braithwaite ได้สร้างการออกกำลังกายที่เขาเรียกว่าTDD เช่นถ้าคุณหมายถึงมัน ประกอบด้วยชุดของกฎ (ตามกฎสามข้อของ TDD ของลุงมาร์ตินแต่เข้มงวดกว่า) ที่คุณต้องปฏิบัติตามอย่างเคร่งครัดและได้รับการออกแบบมาเพื่อนำคุณไปสู่การใช้ TDD อย่างเข้มงวดยิ่งขึ้น มันทำงานได้ดีที่สุดกับการเขียนโปรแกรมคู่ (เพื่อให้คู่ของคุณสามารถตรวจสอบให้แน่ใจว่าคุณไม่ได้ละเมิดกฎ) และผู้สอน
กฎคือ:
- เขียนการทดสอบใหม่หนึ่งการทดสอบที่เล็กที่สุดที่คุณสามารถชี้ไปในทิศทางของโซลูชันได้
- เห็นมันล้มเหลว การรวบรวมความล้มเหลวนับเป็นความล้มเหลว
- ทำให้การทดสอบจาก (1) การส่งผ่านโดยการเขียนรหัสการดำเนินการอย่างน้อยคุณสามารถในวิธีการทดสอบ
- Refactor เพื่อลบการทำซ้ำและอื่น ๆ ตามที่จำเป็นในการปรับปรุงการออกแบบ เข้มงวดเกี่ยวกับการใช้การเคลื่อนไหวเหล่านี้:
- คุณต้องการวิธีการใหม่ - รอจนกว่าจะถึงเวลาการทำให้ใหม่แล้ว ...สร้างวิธีการใหม่ (ไม่ใช่การทดสอบ) โดยทำอย่างใดอย่างหนึ่งต่อไปนี้และไม่ใช้วิธีอื่น:
- ที่ต้องการ: ทำวิธีการแยกในรหัสการใช้งานที่สร้างขึ้นตาม (3) เพื่อสร้างวิธีการใหม่ในชั้นเรียนทดสอบหรือ
- หากคุณต้อง: ย้ายรหัสการใช้งานตาม (3) ไปยังวิธีการใช้งานที่มีอยู่
- คุณต้องการคลาสใหม่ - รอจนกว่าจะถึงเวลารีแฟคเจอริ่งแล้ว ...สร้างคลาสที่ไม่ได้ทดสอบเพื่อระบุปลายทางสำหรับวิธีการย้ายและไม่มีเหตุผลอื่น
- เติมคลาสการใช้งานด้วยวิธีการโดยใช้วิธีการย้ายและไม่มีวิธีอื่น
โดยทั่วไปแล้วสิ่งนี้จะนำไปสู่การออกแบบที่แตกต่างกว่า "วิธีหลอก" TDD "ของ" จินตนาการในหัวของคุณว่าการออกแบบควรเป็นแบบใดจากนั้นจึงเขียนการทดสอบเพื่อบังคับการออกแบบนั้น ทดสอบ"
เมื่อกลุ่มคนที่ดำเนินการบางอย่างเช่นแทคเกมนิ้วเท้า Tic ใช้หลอก TDD พวกเขามักจะจบลงด้วยการออกแบบที่คล้ายกันมากที่เกี่ยวข้องกับชนิดของบางBoard
ชั้นมี 3 × 3 อาร์เรย์ของInteger
s และอย่างน้อยส่วนหนึ่งของโปรแกรมเมอร์จะได้เขียนคลาสนี้โดยไม่ต้องทำการทดสอบเพราะพวกเขา "รู้ว่าพวกเขาต้องการมัน" หรือ "ต้องการบางสิ่งบางอย่างในการเขียนการทดสอบ" แต่เมื่อคุณบังคับว่ากลุ่มเดียวกันจะใช้ TDD Board
เช่นถ้าคุณหมายความว่ามันพวกเขามักจะจบลงด้วยความหลากหลายของการออกแบบที่แตกต่างกันมากมักจะไม่จ้างอะไรได้จากระยะไกลคล้ายกับ
มีวิธีใดที่คุณสามารถระบุได้ว่าแบบทดสอบที่คุณเขียนนั้นเพียงพอหรือไม่
เมื่อพวกเขาครอบคลุมความต้องการทางธุรกิจทั้งหมด การทดสอบเป็นการเข้ารหัสข้อกำหนดของระบบ
เป็นการดีหรือไม่ที่จะทดสอบการเขียนสำหรับฟังก์ชั่นที่ง่ายมากซึ่งอาจเทียบเท่ากับ 1 + 1 = 2 หรือเป็นเพียงภาพซ้อนทับ?
คุณมีแบบย้อนกลับ: คุณไม่ได้เขียนการทดสอบสำหรับการใช้งาน คุณเขียนฟังก์ชันการทำงานสำหรับการทดสอบ หากฟังก์ชั่นที่จะได้รับการทดสอบผ่านจะกลายเป็นเรื่องไม่สำคัญมันเยี่ยมมาก! คุณเพียงแค่ทำตามข้อกำหนดของระบบและไม่ต้องทำงานหนักสำหรับมัน!
มันเป็นการดีที่จะเปลี่ยนฟังก์ชั่นและตามการทดสอบว่ามีการเปลี่ยนแปลงข้อกำหนด?
เลขที่วิธีอื่น ๆ รอบ หากความต้องการเปลี่ยนแปลงคุณเปลี่ยนการทดสอบที่สอดคล้องกับข้อกำหนดนั้นดูมันล้มเหลวจากนั้นเปลี่ยนรหัสเพื่อให้ผ่าน การทดสอบเสมอมาก่อน
มันยากที่จะทำเช่นนี้ คุณต้องฝึกซ้อมอย่างรอบคอบหลายสิบชั่วโมงหลายร้อยชั่วโมงเพื่อสร้าง "หน่วยความจำกล้ามเนื้อ" เพื่อไปยังจุดที่กำหนดเวลาสิ้นสุดและคุณตกอยู่ภายใต้แรงกดดันคุณไม่ต้องคิดอะไร และการทำเช่นนี้จะกลายเป็นวิธีการทำงานที่รวดเร็วและเป็นธรรมชาติที่สุด