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
, 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 ...mergesort
. Jika Anda mencari cara "benar" untuk melakukan ini, tidak ada satu, selain menjadi akurat tentang pemetaanmergesort
algoritma Anda ke serangkaian tes unit; yaitu mereka harus mencerminkan apa yangmergesort
sebenarnya dilakukan.mergesort
desain muncul secara alami dari red-green-refactor, itu tidak akan terjadi kecuali jika Anda memandu proses berdasarkan pengetahuan Anda yang adamergesort
.merge
harus diciptakan hanya pada tahap "refactoring". Jika Anda melihatmerge
metode itu dapat diperkenalkan untuk lulus dari tesmergesort
Anda, pertama-tama buat tes Anda berlalu tanpamerge
metode. Kemudian refactor implementasi Anda dengan memperkenalkanmerge
metode.Jawaban:
Berikut adalah beberapa cara alternatif untuk melihat opsi Anda. Tapi pertama-tama, aturan TDD, dari Paman Bob dengan penekanan oleh saya:
Jadi, satu cara untuk membaca aturan nomor 3 adalah bahwa Anda memerlukan
merge
fungsi untuk lulus tes, sehingga Anda dapat mengimplementasikannya - tetapi hanya dalam bentuk yang paling dasar.Atau, secara bergantian, Anda mulai dengan menulis operasi gabungan inline, dan kemudian refactor menjadi fungsi setelah mendapatkan tes untuk bekerja.
Penafsiran lain adalah bahwa Anda menulis mergesort, Anda tahu bahwa Anda akan memerlukan
merge
operasi (yaitu, itu bukan YAGNI, yang merupakan apa yang berusaha dikurangi oleh aturan "cukup"). Oleh karena itu, Anda harus mulai dengan tes untuk penggabungan, dan baru kemudian melanjutkan ke tes untuk keseluruhan jenis.sumber
merge
secara mengejutkan berantakan, bijaksana-tepi-(dan juga berguna sebagai mandiri) ide untuk melakukannya sebagai fungsi terpisah lebih masuk akal. Namun, gaya melakukannya sejajar dalam bentuk dasarnya dan kemudian memperhitungkannya pada tahap topi biru tampaknya benar dan sangat sesuai dengan apa yang saya cari.merge
operasi sebelum melakukan semacam itu (serta pengujian terpisahpartition
operasi). Saya berpikir bahwa manfaat yang muncul dari desain muncul berasal dari bekerja secara perlahan menuju tujuan yang diketahui. Dalam kasus mergesort, saya tidak berpikir tujuannya adalah penyortiran secara umum (karena Anda akan berakhir dengan semacam gelembung). Anda tahu operasi dasar, jadi Anda bekerja menuju operasi itu; jenisnya sebagian besar adalah renungan.merge
fungsi ke dalammergesort
dan mengejek perilakunya. Kemudian kembali dan lakukanmerge
tes terlebih dahulu. Delegasi luar biasa ™.