แนะนำสั้น ๆ สำหรับคำถามนี้ ฉันใช้ตอนนี้ TDD และเมื่อเร็ว ๆ นี้ BDD นานกว่าหนึ่งปีแล้ว ฉันใช้เทคนิคอย่างเยาะเย้ยเพื่อให้การเขียนการทดสอบของฉันมีประสิทธิภาพยิ่งขึ้น เมื่อเร็ว ๆ นี้ฉันได้เริ่มโครงการส่วนตัวเพื่อเขียนโปรแกรมการจัดการเงินเล็กน้อยสำหรับตัวเอง เนื่องจากฉันไม่มีรหัสดั้งเดิมมันเป็นโครงการที่สมบูรณ์แบบที่จะเริ่มต้นด้วย TDD โชคไม่ดีที่ฉันไม่ได้สัมผัสกับความสุขของ TDD มาก มันทำให้เสียความสนุกของฉันมากจนฉันเลิกโครงการไปแล้ว
ปัญหาคืออะไร? ฉันใช้วิธี TDD เหมือนวิธีการเพื่อให้การทดสอบ / ความต้องการพัฒนาการออกแบบของโปรแกรม ปัญหาคือกว่าครึ่งหนึ่งของเวลาในการพัฒนาสำหรับการทดสอบการเขียน / การรีแฟคเตอร์ ดังนั้นในที่สุดฉันก็ไม่ต้องการที่จะใช้คุณสมบัติอื่น ๆ อีกต่อไปเพราะฉันจะต้องปรับโครงสร้างและเขียนการทดสอบจำนวนมาก
ที่ทำงานฉันมีรหัสดั้งเดิมมากมาย ที่นี่ฉันเขียนมากขึ้นและมากขึ้นการทดสอบการยอมรับและการทดสอบหน่วยน้อย สิ่งนี้ดูเหมือนจะไม่ใช่วิธีที่ไม่ดีเนื่องจากข้อบกพร่องส่วนใหญ่ถูกตรวจพบโดยการทดสอบการยอมรับและการรวม
ความคิดของฉันคือในที่สุดฉันก็สามารถเขียนการทดสอบการรวมและการยอมรับได้มากกว่าการทดสอบหน่วย อย่างที่ฉันบอกว่าสำหรับการตรวจจับข้อบกพร่องการทดสอบหน่วยไม่ได้ดีไปกว่าการทดสอบการรวม / การยอมรับ การทดสอบหน่วยก็ดีสำหรับการออกแบบเช่นกัน เนื่องจากฉันเคยเขียนจำนวนมากเรียนของฉันจึงได้รับการออกแบบให้สามารถทดสอบได้ดีเสมอ นอกจากนี้วิธีการเพื่อให้การทดสอบ / ความต้องการเป็นแนวทางในการออกแบบนำไปสู่ในกรณีส่วนใหญ่เพื่อการออกแบบที่ดีขึ้น ข้อได้เปรียบสุดท้ายของการทดสอบหน่วยคือพวกมันเร็วกว่า ฉันได้เขียนการทดสอบการรวมเข้าด้วยกันพอที่จะรู้ว่าพวกเขาสามารถทำได้เร็วเท่ากับการทดสอบหน่วย
หลังจากที่ผมถูกมองผ่านทางเว็บผมพบว่ามีความคิดที่คล้ายกันมากกับเหมืองกล่าวถึงที่นี่และมี คุณคิดอย่างไรกับความคิดนี้
แก้ไข
การตอบคำถามตัวอย่างหนึ่งที่การออกแบบนั้นดี แต่ฉันต้องการการรีแฟคเตอร์ขนาดใหญ่สำหรับข้อกำหนดต่อไป:
ตอนแรกมีข้อกำหนดบางประการในการดำเนินการคำสั่งบางอย่าง ฉันเขียนตัวแยกวิเคราะห์คำสั่งที่ขยายได้ - ซึ่งคำสั่งแยกวิเคราะห์จากพรอมต์คำสั่งบางชนิดและเรียกสิ่งที่ถูกต้องในรูปแบบ ผลลัพธ์ถูกแสดงในคลาสโมเดลมุมมอง:
ไม่มีอะไรผิดปกติที่นี่ ทุกคลาสมีความเป็นอิสระจากกันและฉันสามารถเพิ่มคำสั่งใหม่แสดงข้อมูลใหม่ได้อย่างง่ายดาย
ข้อกำหนดต่อไปคือทุกคำสั่งควรมีมุมมองเป็นของตนเอง - ตัวอย่างบางส่วนของผลลัพธ์ของคำสั่ง ฉันออกแบบโปรแกรมใหม่เพื่อให้ได้การออกแบบที่ดีขึ้นสำหรับข้อกำหนดใหม่:
สิ่งนี้ก็เป็นสิ่งที่ดีเพราะตอนนี้ทุกคำสั่งมีรูปแบบมุมมองของตัวเองและตัวอย่างของมันเอง
สิ่งสำคัญคือตัวแยกวิเคราะห์คำสั่งถูกเปลี่ยนเพื่อใช้การแยกวิเคราะห์คำสั่งของโทเค็นและถูกถอดออกจากความสามารถในการเรียกใช้คำสั่ง ทุกคำสั่งมีรูปแบบมุมมองเป็นของตัวเองและรูปแบบมุมมองข้อมูลเท่านั้นที่รู้รูปแบบมุมมองคำสั่งปัจจุบันซึ่งรู้มากกว่าข้อมูลที่ต้องแสดง
ทั้งหมดที่ฉันอยากรู้ ณ จุดนี้คือถ้าการออกแบบใหม่ไม่ทำลายข้อกำหนดที่มีอยู่ ฉันไม่ต้องเปลี่ยนการทดสอบตอบรับใด ๆ ฉันต้อง refactor หรือลบการทดสอบเกือบทุกหน่วยซึ่งเป็นกองงานขนาดใหญ่
สิ่งที่ฉันต้องการแสดงที่นี่เป็นสถานการณ์ทั่วไปที่เกิดขึ้นบ่อยครั้งในระหว่างการพัฒนา ไม่มีปัญหากับการออกแบบเก่าหรือใหม่พวกเขาเพียงแค่เปลี่ยนไปตามข้อกำหนด - ฉันเข้าใจได้อย่างไรนี่เป็นข้อดีอย่างหนึ่งของ TDD ที่การออกแบบวิวัฒนาการ
ข้อสรุป
ขอบคุณสำหรับคำตอบและการอภิปรายทั้งหมด ในบทสรุปของการสนทนานี้ฉันมีความคิดของวิธีการที่ฉันจะทดสอบกับโครงการต่อไปของฉัน
- ก่อนอื่นฉันเขียนการทดสอบทั้งหมดก่อนที่จะใช้สิ่งที่ฉันทำ
- สำหรับข้อกำหนดในตอนแรกฉันเขียนแบบทดสอบตอบรับซึ่งทดสอบโปรแกรมทั้งหมด จากนั้นฉันเขียนการทดสอบการรวมสำหรับส่วนประกอบที่ฉันต้องใช้ข้อกำหนด หากมีองค์ประกอบที่ทำงานร่วมกันอย่างใกล้ชิดกับส่วนประกอบอื่นเพื่อใช้ข้อกำหนดนี้ฉันจะเขียนการทดสอบการรวมบางส่วนที่ทั้งสองส่วนประกอบได้รับการทดสอบร่วมกัน สุดท้าย แต่ไม่ท้ายสุดถ้าฉันต้องเขียนอัลกอริธึมหรือคลาสอื่น ๆ ที่มีการเรียงสับเปลี่ยนสูง - เช่น serializer - ฉันจะเขียนการทดสอบหน่วยสำหรับคลาสนี้โดยเฉพาะ คลาสอื่นทั้งหมดไม่ได้ทดสอบ แต่เป็นการทดสอบหน่วย
- สำหรับข้อบกพร่องกระบวนการสามารถลดความซับซ้อน โดยปกติแล้วบั๊กเกิดจากส่วนประกอบหนึ่งหรือสองชิ้น ในกรณีนี้ฉันจะเขียนหนึ่งการทดสอบการรวมสำหรับองค์ประกอบที่ทดสอบข้อผิดพลาด ถ้ามันเกี่ยวข้องกับอัลกอริทึมฉันจะเขียนการทดสอบหน่วยเท่านั้น หากไม่สะดวกในการตรวจสอบส่วนประกอบที่มีข้อบกพร่องเกิดขึ้นฉันจะเขียนการทดสอบการยอมรับเพื่อค้นหาข้อผิดพลาด - นี่ควรเป็นข้อยกเว้น