ไม่เพียง แต่การทดสอบหน่วยอำนวยความสะดวกในการออกแบบ แต่ยังเป็นหนึ่งในผลประโยชน์ที่สำคัญของพวกเขา
การเขียนไดรฟ์ทดสอบตัวแรกนั้นมีความเป็นโมดูลและโครงสร้างโค้ดที่สะอาด
เมื่อคุณเขียนรหัสทดสอบก่อนคุณจะพบว่า "เงื่อนไข" ใด ๆ ของหน่วยของรหัสที่กำหนดจะถูกผลักออกไปตามธรรมชาติ (โดยปกติผ่าน mocks หรือต้นขั้ว) เมื่อคุณถือว่าพวกเขาในรหัสของคุณ
"กำหนดเงื่อนไข x, คาดหวังพฤติกรรม y," มักจะกลายเป็นต้นขั้วในการจัดหาx
(ซึ่งเป็นสถานการณ์ที่การทดสอบจำเป็นต้องตรวจสอบพฤติกรรมขององค์ประกอบปัจจุบัน) และy
จะกลายเป็นการเยาะเย้ยการโทรที่จะถูกตรวจสอบที่ จุดสิ้นสุดของการทดสอบ (เว้นแต่จะเป็น "ควรส่งคืนy
" ซึ่งในกรณีนี้การทดสอบจะตรวจสอบค่าส่งคืนอย่างชัดเจน)
จากนั้นเมื่อหน่วยนี้ทำงานตามที่ระบุไว้คุณจะไปยังการเขียนการพึ่งพา (สำหรับx
และy
) ที่คุณค้นพบ
สิ่งนี้ทำให้การเขียนโค้ดแบบแยกส่วนสะอาดเป็นกระบวนการที่ง่ายและเป็นธรรมชาติมากมิฉะนั้นแล้วก็มักจะทำให้ความรับผิดชอบและพฤติกรรมคู่กันพร่ามัวได้โดยง่าย
การทดสอบการเขียนในภายหลังจะบอกคุณเมื่อรหัสของคุณมีโครงสร้างไม่ดี
เมื่อเขียนการทดสอบสำหรับรหัสกลายเป็นเรื่องยากเพราะมีหลายสิ่งที่จะทำให้ต้นขั้วหรือเยาะเย้ยมากเกินไปหรือเพราะสิ่งต่าง ๆ เข้าด้วยกันแน่นเกินไปคุณรู้ว่าคุณมีการปรับปรุงในรหัสของคุณ
เมื่อ "การเปลี่ยนแปลงการทดสอบ" กลายเป็นภาระเพราะมีพฤติกรรมมากมายในหน่วยเดียวคุณรู้ว่าคุณมีการปรับปรุงในโค้ดของคุณ (หรือเพียงแค่ในแนวทางของคุณในการเขียนการทดสอบ - แต่นี่ไม่ใช่เรื่องปกติในประสบการณ์ของฉัน) .
เมื่อสถานการณ์ของคุณกลายเป็นความซับซ้อนมากเกินไป ( "ถ้าx
และy
และz
แล้ว ...") เพราะคุณจะต้องมากขึ้นนามธรรมคุณรู้ว่าคุณมีการปรับปรุงเพื่อให้ในรหัสของคุณ
เมื่อคุณสิ้นสุดการทดสอบเดียวกันในสองการแข่งขันที่แตกต่างกันเนื่องจากการทำซ้ำและซ้ำซ้อนคุณรู้ว่าคุณมีการปรับปรุงที่จะทำในรหัสของคุณ
นี่คือการพูดคุยที่ยอดเยี่ยมโดย Michael Feathersแสดงให้เห็นถึงความสัมพันธ์อย่างใกล้ชิดระหว่างความสามารถในการทดสอบและการออกแบบในโค้ด (โพสต์ครั้งแรกโดย displayName ในความคิดเห็น) คำปราศรัยยังกล่าวถึงข้อร้องเรียนที่พบบ่อยและความเข้าใจผิดเกี่ยวกับการออกแบบที่ดีและความสามารถในการทดสอบโดยทั่วไป