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. merge
TDD 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
mergesort
o çağrımerge
; sonramerge
iş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, mergesort
algoritmayı bir dizi birim sınamaya eşlemenizle ilgili doğru olmaktan başka bir yol yoktur ; yani mergesort
aslında bir şeyin ne yaptığını yansıtmalıdırlar .
mergesort
tasarı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
.
merge
sadece "yeniden düzenleme" aşamasında icat edilmelidir. Bu merge
yöntemin testi mergesort
geçmeniz için tanıtılabileceğini görürseniz, ilk önce testlerinizi merge
yöntem olmadan geçirin . Ardından, merge
yöntemi tanıtarak uygulamanızı yeniden düzenleyin .
mergesort
zaten ç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ü