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 mergemenggunakan TDD? Sepertinya saya tidak bisa karena saya mengalami "gagal" gagal, ujian gagal untuk mergesort, yang tidak akan berlalu sampai mergeselesai! 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
mergesortpanggilan itumerge; lalu setelah mulaimergebekerja, 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 mergesortalgoritma Anda ke serangkaian tes unit; yaitu mereka harus mencerminkan apa yang mergesortsebenarnya dilakukan.
mergesortdesain muncul secara alami dari red-green-refactor, itu tidak akan terjadi kecuali jika Anda memandu proses berdasarkan pengetahuan Anda yang ada mergesort.
mergeharus diciptakan hanya pada tahap "refactoring". Jika Anda melihat mergemetode itu dapat diperkenalkan untuk lulus dari tes mergesortAnda, pertama-tama buat tes Anda berlalu tanpa mergemetode. Kemudian refactor implementasi Anda dengan memperkenalkan mergemetode.
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 ...