ฉันควรกำหนดหน่วยการทดสอบอีกครั้งเมื่อฉันแยกคลาสออกจากระบบภายใต้การทดสอบหรือไม่


13

ฉันเขียนคลาสนี้ที่ทำบางสิ่ง (บางทีนี่อาจเป็นการละเมิดหลักการความรับผิดชอบเดี่ยว) ตอนนี้ฉันรู้แล้วว่าบางส่วนของโครงการต้องการตรรกะชิ้นหนึ่งและวิธีที่ฉันจะเปิดเผยก็คือการดึงคลาสออกจากระบบเดิมภายใต้การทดสอบของฉัน

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

ฉันควร refactor รหัสทดสอบของฉันหลังจากที่ฉันทำเสร็จแล้ว? IE: สร้าง ExtractedClassTest และย้ายการทดสอบที่เกี่ยวข้องทั้งหมดจาก OriginalClassTest ลงไปหรือไม่ ดูเหมือนว่าอาจมีความเสี่ยงเล็กน้อย: ฉันอาจสูญเสียความครอบคลุมบางส่วนในกระบวนการอาจไม่ง่ายเหมือนการย้ายการทดสอบและฉันสิ้นสุดการเขียนรหัสการทดสอบบางอย่างที่ฉันรู้ว่าเคยทำงาน แต่อาจไม่ได้อีกต่อไป เป็นต้น

ในทางกลับกันถ้าฉันปล่อยให้ OriginalClassTest ตามเดิมฉันสามารถเห็นว่านี่เป็นปัญหาการบำรุงรักษาทดสอบ มันจะสับสนเล็กน้อยในการค้นหาที่การทดสอบของ ExtractedClass ความประทับใจแรกของคุณก็คือมันไม่มีอยู่จริง เมื่อเวลาผ่านไปด้วยการปรับโครงสร้างรหัสการผลิตจำนวนมากสิ่งนี้อาจกลายเป็นปัญหาร้ายแรง

ฉันใหม่สำหรับ TDD ดังนั้นฉันต้องการคำแนะนำจากผู้เชี่ยวชาญ ขอบคุณ!

คำตอบ:


7

หลังจากดูคำพูดที่น่าทึ่งนี้ "เอียนคูเปอร์: TDD มันผิดพลาดที่ไหน" ฉันจะไม่เห็นด้วยกับ @pdr ฉันคิดว่าคุณควรทำการทดสอบดั้งเดิมต่อไป ความสามารถในการ refactor ระบบของคุณภายใต้การทดสอบโดยไม่ทำลายการเขียนหรือการเปลี่ยนแปลงการทดสอบใด ๆ เป็นจุดประสงค์ทั้งหมดของการเขียนการทดสอบในสถานที่แรก

ถ้าฉันจะทดสอบคลาสที่แยกออกมาฉันจะทดสอบการใช้งานมากกว่าพฤติกรรม เป็นผลให้รหัสของฉันจะยากต่อการ refactor ในอนาคต: การทดสอบใหม่เหล่านี้อาจล้มเหลวแม้ว่าพฤติกรรมยังคงทำงาน


6

ในช่วงระยะเวลาของการพัฒนามีทั้ง เก็บการทดสอบเก่าไว้เป็นประกันว่าคุณจะไม่เสียอะไรเขียนการทดสอบใหม่ (ตั้งแต่เริ่มต้น) เพื่อช่วยคุณออกแบบคลาสตามที่ควรจะเป็น

ในตอนท้ายให้เรียกใช้และลบสิ่งที่หมดอายุในการทดสอบเก่า ระมัดระวังในการวิเคราะห์นี้ อย่าลบบางสิ่งออกเพราะคุณคิดว่าควรเลิกใช้แล้ว แสดงให้เห็นถึงตัวเอง (หรือคนอื่นหรือเป็ดยาง) ทำไมมันไม่จำเป็นอีกต่อไป หยุดการทดสอบและตรวจสอบให้แน่ใจว่าการทดสอบอื่นหยุดพัก

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

เพราะคุณพูดถูกคุณไม่ต้องการถูกทิ้งให้อยู่กับฝันร้ายบำรุงรักษา แต่คุณไม่ต้องการเส้นทางที่ครอบคลุมน้อยกว่าที่เคยมีมา


1
ฉันเพิ่งทำสิ่งนี้และฉันต้องบอกว่ามันเป็นการลดทอนความสวย แม้ว่าการเปลี่ยนแปลงของฉันจะตรงไปตรงมาก็ใช้เวลาประมาณ 2 ชั่วโมงเพื่อให้แน่ใจว่าฉัน refactored การทดสอบของฉันอย่างถูกต้องและฉันยังคงมีความคุ้มครองที่เหมือนกัน เห็นได้ชัดว่าฉันควรเพิ่มการทดสอบพิเศษสองสามครั้งในการทดสอบใหม่เพื่อให้แน่ใจว่าฉันกำลังตรวจสอบสิ่งต่าง ๆ ฉันรู้สึกว่ามันจะมีประสิทธิภาพมากขึ้นในการแยกชั้นเรียนและออกจากระบบทั้งสองภายใต้การทดสอบ จำนวนงานนี้แนะนำให้ฉันเขียนแบบทดสอบไม่ดีหรือไม่?
Daniel Kaplan

1
@tietyt: ตอบยากโดยไม่ต้องนั่งมองคุณ บางครั้ง TDD ดูเหมือนจะทำงานได้มากกว่าที่คุ้มค่า ในบางครั้งคุณจะได้รับการเตือนว่าทำไมคุณถึงต้องใส่ใจ และบางครั้งก็เป็นคุณที่ทำให้มันยากขึ้น การเรียนรู้ที่จะบอกความแตกต่างเป็นส่วนสำคัญในการทำให้ TDD ดีขึ้น
pdr

คุณคิดว่าเป็นไปได้ไหมที่ในกรณีนี้ฉันไม่ควรทำการทดสอบใหม่อีกครั้งหรือคุณคิดว่ามันไม่น่าเป็นไปได้หรือ
Daniel Kaplan

1
@tieTYT: ไม่แน่ใช่ เป็นไปไม่ได้ไม่มี
สาธารณรัฐประชาธิปไตยประชาชนลาว
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.