Saya tidak jelas bagaimana TDD, metodologi, menangani kasus berikut. Misalkan saya ingin mengimplementasikan algoritma mergesort, dengan Python. Saya mulai dengan menulis
assert mergesort([]) === []
dan tes gagal dengan
NameError: nama 'mergesort' tidak didefinisikan
Saya kemudian menambahkan
def mergesort(a):
return []
dan tes saya lolos. Selanjutnya saya tambahkan
assert mergesort[5] == 5
dan pengujian saya gagal dengan
AssertionError
yang saya buat lulus
def mergesort(a):
if not a:
return []
else:
return a
Selanjutnya, saya tambahkan
assert mergesort([10, 30, 20]) == [10, 20, 30]
dan saya sekarang harus mencoba untuk lulus ini. Saya "tahu" algoritma mergesort jadi saya menulis:
def mergesort(a):
if not a:
return []
else:
left, right = a[:len(a)//2], a[len(a)//2:]
return merge(mergesort(left)), mergesort(right))
Dan ini gagal dengan
NameError: name 'merge' tidak didefinisikan
Sekarang inilah pertanyaannya. Bagaimana saya bisa lari dan mulai menerapkan merge
menggunakan TDD? Sepertinya saya tidak bisa karena saya mengalami "gagal" gagal, ujian gagal untuk mergesort
, yang tidak akan berlalu sampai merge
selesai! Jika tes ini berlangsung, saya tidak akan pernah bisa melakukan TDD karena saya tidak akan menjadi "hijau" selama pembuatan iterasi TDD saya merge
.
Sepertinya saya terjebak dengan tiga skenario buruk berikut, dan ingin tahu (1) yang mana yang disukai komunitas TDD, atau (2) apakah ada pendekatan lain yang saya lewatkan? Saya telah menyaksikan beberapa penelusuran TDD Paman Bob dan tidak ingat melihat kasus seperti ini sebelumnya!
Berikut adalah 3 kasus:
- Terapkan penggabungan dalam direktori yang berbeda dengan rangkaian uji yang berbeda.
- Jangan khawatir menjadi hijau saat mengembangkan fungsi helper, hanya melacak secara manual tes mana yang benar - benar ingin Anda lewati.
- Mengomentari (GASP!) Atau menghapus saluran dalam
mergesort
panggilan itumerge
; lalu setelah mulaimerge
bekerja, masukkan kembali.
Ini semua tampak konyol bagi saya (atau saya melihat ini salah?). Adakah yang tahu pendekatan yang disukai?
mergesort
. Jika Anda mencari cara "benar" untuk melakukan ini, tidak ada satu, selain menjadi akurat tentang pemetaan mergesort
algoritma Anda ke serangkaian tes unit; yaitu mereka harus mencerminkan apa yang mergesort
sebenarnya dilakukan.
mergesort
desain muncul secara alami dari red-green-refactor, itu tidak akan terjadi kecuali jika Anda memandu proses berdasarkan pengetahuan Anda yang ada mergesort
.
merge
harus diciptakan hanya pada tahap "refactoring". Jika Anda melihat merge
metode itu dapat diperkenalkan untuk lulus dari tes mergesort
Anda, pertama-tama buat tes Anda berlalu tanpa merge
metode. Kemudian refactor implementasi Anda dengan memperkenalkan merge
metode.
mergesort
, karena sudah merupakan algoritma yang terdefinisi dengan sangat baik, proses penemuan ini tidak diperlukan, dan kemudian menjadi masalah pemetaan apa yang sudah Anda ketahui sebagai desain untuk serangkaian tes unit. Agaknya, tes tingkat atas Anda menegaskan bahwa metode Anda dalam pengujian menerima koleksi yang tidak disortir dan mengembalikan koleksi yang disortir ...