Metodoloji olan TDD'nin aşağıdaki durumu nasıl ele aldığından emin değilim. Diyelim ki Python'da mergesort algoritmasını uygulamak istiyorum. Yazarak başlarım
assert mergesort([]) === []
ve test başarısız olur
NameError: 'mergesort' adı tanımlanmadı
Sonra eklerim
def mergesort(a):
return []
ve testim geçer. Sonra ekliyorum
assert mergesort[5] == 5
ve testim başarısız oluyor
AssertionError
hangi ile geçiyorum
def mergesort(a):
if not a:
return []
else:
return a
Sonra, ekliyorum
assert mergesort([10, 30, 20]) == [10, 20, 30]
ve şimdi bu geçişi yapmaya çalışmalıyım. Ben "mergesort algoritması biliyorum" bu yüzden yazmak:
def mergesort(a):
if not a:
return []
else:
left, right = a[:len(a)//2], a[len(a)//2:]
return merge(mergesort(left)), mergesort(right))
Ve bu başarısız olur
NameError: 'birleştirme' adı tanımlanmadı
Şimdi soru şu. mergeTDD kullanarak uygulamaya nasıl başlayabilir ve uygulamaya başlayabilirim ? Yapamam gibi görünüyor çünkü bu "asılı" yerine getirilmemiş, başarısız testi mergesort, bitene kadar geçmeyecek var merge! Bu test takılırsa, TDD'yi asla gerçekten yapamam çünkü TDD yinelemelerimi oluştururken "yeşil" olmayacağım merge.
Aşağıdaki üç çirkin senaryoya takılı kaldım ve (1) TDD topluluğu bunlardan hangisini tercih ettiğini bilmek ister ya da (2) kaçırdığım başka bir yaklaşım var mı? Birkaç Bob Amca TD izlenimini izledim ve daha önce böyle bir vaka gördüğümü hatırlamıyorum!
İşte 3 durum:
- Birleştirme işlemini farklı bir dizinde farklı bir dizinde uygulayın.
- Yardımcı işlevi geliştirirken yeşil olma konusunda endişelenmeyin, sadece hangi testleri gerçekten geçmek istediğinizi manuel olarak takip edin .
- (! GASP) dışında açıklama veya satırları silmek
mergesorto çağrımerge; sonramergeişe koyulduktan sonra tekrar yerine koyun.
Bunların hepsi bana aptalca bakıyor (ya da buna yanlış mı bakıyorum?). Tercih edilen yaklaşımı bilen var mı?
mergesort. Bunu yapmanın "doğru" yolunu arıyorsanız, mergesortalgoritmayı bir dizi birim sınamaya eşlemenizle ilgili doğru olmaktan başka bir yol yoktur ; yani mergesortaslında bir şeyin ne yaptığını yansıtmalıdırlar .
mergesorttasarımın kırmızı-yeşil-refactor'dan doğal olarak ortaya çıkmasını bekliyorsanız , süreci mevcut bilginize göre yönlendirmezseniz bu gerçekleşmez mergesort.
mergesadece "yeniden düzenleme" aşamasında icat edilmelidir. Bu mergeyöntemin testi mergesortgeçmeniz için tanıtılabileceğini görürseniz, ilk önce testlerinizi mergeyöntem olmadan geçirin . Ardından, mergeyöntemi tanıtarak uygulamanızı yeniden düzenleyin .
mergesortzaten çok iyi tanımlanmış algoritma olduğundan, bu keşif süreci zorunlu değildir ve bu o zaman zaten birim testlerin bir dizi tasarım olarak bildiğimiz haritalama meselesi haline değildir. Muhtemelen, üst düzey testiniz test edilen yönteminizin sıralanmamış bir koleksiyonu kabul ettiğini ve sıralı bir koleksiyon döndürdüğünü