Tôi không rõ làm thế nào TDD, phương pháp luận, xử lý trường hợp sau đây. Giả sử tôi muốn thực hiện thuật toán sáp nhập, bằng Python. Tôi bắt đầu bằng cách viết
assert mergesort([]) === []
và thử nghiệm thất bại với
NameError: tên 'mergesort' không được xác định
Sau đó tôi thêm
def mergesort(a):
return []
và bài kiểm tra của tôi vượt qua. Tiếp theo tôi thêm
assert mergesort[5] == 5
và bài kiểm tra của tôi thất bại với
Khẳng địnhError
mà tôi vượt qua
def mergesort(a):
if not a:
return []
else:
return a
Tiếp theo, tôi thêm
assert mergesort([10, 30, 20]) == [10, 20, 30]
và bây giờ tôi phải cố gắng vượt qua. Tôi "biết" thuật toán sáp nhập nên tôi viết:
def mergesort(a):
if not a:
return []
else:
left, right = a[:len(a)//2], a[len(a)//2:]
return merge(mergesort(left)), mergesort(right))
Và điều này thất bại với
NameError: tên 'merge' không được xác định
Bây giờ đây là câu hỏi. Làm thế nào tôi có thể chạy đi và bắt đầu thực hiện merge
bằng TDD? Có vẻ như tôi không thể bởi vì tôi đã "treo" chưa hoàn thành, thử nghiệm thất bại mergesort
, sẽ không vượt qua cho đến khi merge
kết thúc! Nếu bài kiểm tra này bị treo, tôi không bao giờ thực sự có thể làm TDD vì tôi sẽ không "xanh" trong quá trình xây dựng lặp TDD của mình merge
.
Có vẻ như tôi bị mắc kẹt với ba kịch bản xấu xí sau đây, và muốn biết (1) cộng đồng TDD thích cái nào trong số này, hoặc (2) có cách tiếp cận nào khác mà tôi đang thiếu không? Tôi đã xem một số hướng dẫn của Bác Bob TDD và không nhớ đã thấy một trường hợp như thế này trước đây!
Dưới đây là 3 trường hợp:
- Thực hiện hợp nhất trong một thư mục khác với một bộ kiểm tra khác.
- Đừng lo lắng về việc có màu xanh khi phát triển chức năng của trình trợ giúp, chỉ cần theo dõi thủ công các thử nghiệm mà bạn thực sự muốn vượt qua.
- Nhận xét (GASP!) Hoặc xóa các dòng trong
mergesort
cuộc gọi đómerge
; sau khi đimerge
làm, đặt chúng trở lại.
Tất cả đều trông ngớ ngẩn với tôi (hoặc tôi đang nhìn sai điều này?). Có ai biết cách tiếp cận ưa thích?
mergesort
. Nếu bạn đang tìm kiếm cách "đúng" để làm điều này, thì không có cách nào khác ngoài việc chính xác về việc ánh xạ mergesort
thuật toán của bạn sang một loạt các bài kiểm tra đơn vị; tức là họ nên phản ánh những gì mergesort
thực sự làm.
mergesort
thiết kế xuất hiện tự nhiên từ bộ tái cấu trúc màu đỏ-xanh, điều đó sẽ không xảy ra trừ khi bạn hướng dẫn quy trình dựa trên kiến thức hiện có của bạn mergesort
.
merge
phải được phát minh chỉ trong giai đoạn "tái cấu trúc". Nếu bạn thấy merge
phương pháp đó có thể được giới thiệu để vượt qua bài kiểm tra của mergesort
bạn, trước tiên hãy thực hiện bài kiểm tra của bạn mà không có merge
phương pháp. Sau đó, cấu trúc lại việc thực hiện của bạn bằng cách giới thiệu merge
phương pháp.
mergesort
, vì nó đã là một thuật toán được xác định rõ ràng, quá trình khám phá này là không bắt buộc, và sau đó nó trở thành vấn đề ánh xạ những gì bạn đã biết là thiết kế cho một loạt các bài kiểm tra đơn vị. Có lẽ, bài kiểm tra cấp cao nhất của bạn khẳng định rằng phương pháp của bạn trong bài kiểm tra chấp nhận một bộ sưu tập chưa được sắp xếp và trả về một bộ đã được sắp xếp ...