ฉันไม่ชัดเจนว่า TDD วิธีการจัดการกรณีต่อไปนี้อย่างไร สมมติว่าฉันต้องการใช้อัลกอริทึมการรวมใน Python ฉันเริ่มต้นด้วยการเขียน
assert mergesort([]) === []
และการทดสอบล้มเหลวด้วย
NameError: ไม่ได้กำหนดชื่อ 'การรวม'
ฉันเพิ่มแล้ว
def mergesort(a):
return []
และการทดสอบของฉันผ่าน ต่อไปฉันเพิ่ม
assert mergesort[5] == 5
และการทดสอบของฉันล้มเหลวด้วย
AssertionError
ซึ่งฉันทำไปด้วย
def mergesort(a):
if not a:
return []
else:
return a
ต่อไปฉันเพิ่ม
assert mergesort([10, 30, 20]) == [10, 20, 30]
และตอนนี้ฉันต้องพยายามทำบัตรผ่านนี้ ฉัน "รู้" อัลกอริทึมการรวมดังนั้นฉันเขียน:
def mergesort(a):
if not a:
return []
else:
left, right = a[:len(a)//2], a[len(a)//2:]
return merge(mergesort(left)), mergesort(right))
และสิ่งนี้ล้มเหลวด้วย
NameError: ไม่ได้กำหนดชื่อ 'ผสาน'
ตอนนี้เป็นคำถาม ฉันจะวิ่งออกไปและเริ่มนำไปmerge
ใช้โดยใช้ TDD ได้อย่างไร ดูเหมือนว่าฉันจะไม่ได้เพราะผมได้นี้ "แขวน" ไม่ได้ผล, ความล้มเหลวในการทดสอบmergesort
, ซึ่งจะไม่ผ่านจนกว่าจะmerge
เสร็จสิ้น! หากการทดสอบนี้แฮงค์รอบฉันไม่สามารถทำจริงๆ TDD เพราะผมจะไม่เป็น "สีเขียว" ในช่วงการทำซ้ำ TDD merge
ของฉันก่อสร้าง
ดูเหมือนว่าฉันติดอยู่กับสามสถานการณ์ที่น่าเกลียดดังต่อไปนี้และต้องการที่จะรู้ว่า (1) สิ่งใดที่ชุมชน TDD เหล่านี้ชื่นชอบหรือ (2) มีวิธีอื่นที่ฉันขาดหายไปหรือไม่ ฉันเคยดูคำแนะนำเกี่ยวกับ Uncle Bob TDD หลายครั้งแล้วและจำไม่ได้ว่าเคยเห็นกรณีเช่นนี้มาก่อน!
นี่คือ 3 กรณี:
- ใช้การผสานในไดเรกทอรีอื่นด้วยชุดการทดสอบที่แตกต่างกัน
- ไม่ต้องกังวลเกี่ยวกับการเป็นสีเขียวเมื่อมีการพัฒนาฟังก์ชั่นผู้ช่วยเหลือตนเองเพียงติดตามซึ่งการทดสอบคุณจริงๆต้องการที่จะผ่าน
- ใส่ความคิดเห็น (GASP!) หรือลบบรรทัดในการ
mergesort
โทรmerge
นั้น หลังจากนั้นmerge
ไปทำงานให้ใส่พวกเขากลับมา
ทั้งหมดเหล่านี้ดูโง่สำหรับฉัน (หรือฉันกำลังดูผิดนี้หรือไม่) ไม่มีใครรู้วิธีการที่ต้องการ?
mergesort
ขุดลึกลงกลศาสตร์จริงของ หากคุณกำลังมองหาวิธี "ถูกต้อง" ในการทำสิ่งนี้ไม่มีวิธีอื่นนอกจากความแม่นยำในการทำแผนที่mergesort
อัลกอริทึมของคุณไปยังชุดการทดสอบหน่วยต่างๆ เช่นพวกเขาควรสะท้อนสิ่งที่mergesort
จริงทำ
mergesort
ออกแบบจะเกิดขึ้นเองตามธรรมชาติจากสีแดง - เขียว - refactor นั้นจะไม่เกิดขึ้นถ้าคุณไม่แนะนำกระบวนการตามความรู้ที่มีอยู่ของmergesort
คุณ
merge
จะต้องคิดค้นในขั้นตอน "refactoring" เท่านั้น หากคุณเห็นmerge
วิธีการนั้นสามารถนำมาใช้สำหรับการผ่านการทดสอบของmergesort
คุณก่อนอื่นให้ทำการทดสอบผ่านโดยไม่มีmerge
วิธีการ จากนั้นปรับโครงสร้างการใช้งานของคุณโดยการแนะนำmerge
วิธีการ
mergesort
เนื่องจากมันเป็นอัลกอริธึมที่กำหนดไว้ดีมากกระบวนการค้นหานี้จึงไม่จำเป็นและจากนั้นจะกลายเป็นเรื่องของการทำแผนที่สิ่งที่คุณรู้อยู่แล้วว่าเป็นการออกแบบให้กับชุดการทดสอบหน่วยต่างๆ สันนิษฐานว่าการทดสอบระดับบนสุดของคุณยืนยันว่าวิธีการของคุณภายใต้การทดสอบยอมรับคอลเลกชันที่ไม่เรียงลำดับและส่งคืนหนึ่งการเรียงลำดับ ...