Kastettiğimi düşündüğüm şekilde özel demek istiyorsan, o zaman hayır - bunu birim olarak test etmemelisin. Yalnızca gözlemlenebilir davranış / durumu test eden birim olmalısınız. TDD'nin "kırmızı-yeşil-refactor" döngüsünün arkasındaki noktayı kaçırıyor olabilirsiniz (ve önce test yapmıyorsanız, aynı prensip geçerlidir). Testler yazıldıktan ve geçtikten sonra yeniden düzenleme yapılırken değişmelerini istemezsiniz. Özel işlevselliği birim testi yapmak zorunda kalırsanız, muhtemelen genel işlevsellik etrafındaki birim testlerinin hatalı olduğu anlamına gelir. Genel kodun etrafına test yazmak zor ve karmaşıksa, sınıfınız çok fazla şey yapıyor olabilir veya probleminiz açıkça tanımlanmamış.
Daha da kötüsü, zaman içinde birim testleriniz bir top ve zincir olacak ve herhangi bir değer katmadan sizi yavaşlatacaktır (örneğin, optimizasyon veya çoğaltmanın kaldırılması gibi uygulamaların değiştirilmesi, birim testler üzerinde herhangi bir etkiye sahip olmamalıdır). Bununla birlikte, dahili kod, davranış / durum gözlemlenebilir olduğundan (sadece sınırlı bir şekilde) birim test edilmelidir.
Birim testini ilk yaptığımda, özel şeyleri test etmek için her türlü hileyi çektim, ancak şimdi, kemerin altında birkaç yıl geçirdim, zaman kaybından daha kötü görüyorum.
İşte biraz aptalca örnek, elbette gerçek hayatta bunlardan daha fazla testiniz olacak:
Diyelim ki sıralı bir dize listesi döndüren bir sınıfınız var - sonucun sıralandığını kontrol etmelisiniz, aslında bu listeyi nasıl sıraladığını değil. Uygulamanızı, listeyi sıralayan tek bir algoritma ile başlatabilirsiniz. Bunu yaptıktan sonra, sıralama algoritmanızı değiştirirseniz testinizin değişmesi gerekmez. Bu noktada tek bir testiniz var (sıralamanın sınıfınıza gömülü olduğu varsayılarak):
- Sonucum sıralanıyor mu?
Şimdi iki algoritma istediğinizi (belki bazı durumlarda daha verimli, ancak diğerlerinde değil) istediğinizi varsa, o zaman her algoritma farklı bir sınıf tarafından sağlanabilir (ve genellikle gerekir) ve sınıfınız onlardan alır - bunun olup olmadığını kontrol edebilirsiniz. seçtiğiniz senaryoları taklit kullanarak, ancak orijinal testiniz hala geçerlidir ve yalnızca gözlemlenebilir davranışı / durumu doğruladığımız için değiştirilmesine gerek yoktur. 3 test ile sonuçlanırsınız:
- Sonucum sıralanıyor mu?
- Bir senaryo verildiğinde (diyelim ki ilk liste neredeyse başlamak üzere sıralanıyor) X algoritmasını kullanarak dizeleri sıralayan sınıfa yapılan bir çağrı mı?
- Verilen bir senaryo (ilk liste rastgele sıradadır) Y algoritmasını kullanarak dizeleri sıralayan sınıfa yapılan bir çağrıdır?
Alternatif, sınıfınızdaki özel kodu test etmeye başlamak olurdu - bundan hiçbir şey kazanmıyorsunuz - yukarıdaki testler, birim testleri söz konusu olduğunda bilmem gereken her şeyi anlatıyor. Özel testler ekleyerek kendinize düz bir ceket inşa edersiniz, sadece sonucun sıralandığını değil, aynı zamanda nasıl sıralandığını da kontrol etseydiniz ne kadar daha fazla iş olurdu?
Testler (bu türden) yalnızca davranış değiştiğinde değişmeli, özel koda karşı testler yazmaya başlamalı ve bu pencereden dışarı çıkmalıdır.