Savunma programlamasını desteklemek ve sağlamak için testler yapıldı
Defansif programlama, çalışma zamanında sistemin bütünlüğünü korur.
Testler (çoğunlukla statik) teşhis araçlarıdır. Çalışma zamanında, testleriniz görünürde hiçbir yerde değildir. Yüksek tuğladan bir duvar veya bir kaya kubbesi koymak için kullanılan iskele gibiler. Yapının dışında önemli parçalar bırakmazsınız, çünkü inşaat sırasında ayakta tutan bir iskeleye sahipsiniz. Tüm önemli parçaların yerleştirilmesini kolaylaştırmak için inşaat sırasında dayanan bir iskeleye sahipsiniz .
EDIT: Bir benzetme
Koddaki yorumlardaki analoji ne olacak?
Yorumların amacı vardır, ancak fazlalık olabilir, hatta zararlı olabilir. Örneğin, yorumlar hakkında kodla ilgili temel bilgileri içeri koyarsanız, kodu değiştirin, yorumlar en iyi ihtimalle alakasız ve en kötüsü zararlı olur.
Demek ki, kod tabanınızla ilgili birçok gerçek bilgiyi, TestA gibi testlerden geçirmeyin, ki bu yöntem boş bırakamaz ve MethodB'nin argümanı olmalıdır > 0
. Sonra kod değişir. Şimdi A için null tamamdır ve B, -10 kadar küçük değerler alabilir. Mevcut testler artık işlevsel olarak yanlış, ancak geçmeye devam edecek.
Evet, kodu güncellerken testleri de güncellemelisiniz. Ayrıca kodu güncellerken yorumları da güncellemeniz (veya kaldırmanız) gerekir. Ama hepimiz biliyoruz ki bu şeyler her zaman olmaz ve bu hatalar yapılır.
Testler sistemin davranışını doğrular. Bu gerçek davranış, testlerin kendine özgü değil , sistemin kendisine özgüdür.
Ne yanlış gidebilir ki?
Testlerle ilgili amaç, yanlış olabilecek her şeyi düşünmek, doğru davranışı kontrol eden bir test yazmak ve ardından çalışma zamanı kodunu oluşturmak ve böylece tüm testleri geçmektir.
Bu, savunma programlamasının noktası olduğu anlamına gelir .
TDD sürücüleri testler kapsamlı olursa, savunma programlama.
Daha fazla test, daha savunucu programlama
Hatalar kaçınılmaz olarak bulunduğunda, hatayı gösteren koşulları modellemek için daha fazla test yazılır. Ardından kod, bu testleri geçmek için kodla sabitlenir ve yeni testler test odasında kalır.
İyi bir test seti, hem iyi hem de kötü argümanları bir işleve / yönteme aktaracak ve tutarlı sonuçlar bekleyecektir. Bu da, test edilen bileşenin kendisine iletilen argümanları onaylamak için önkoşul kontrolleri (savunma programlaması) kullanacağı anlamına gelir.
Genel olarak konuşursak ...
Örneğin, belirli bir prosedür için boş bir argüman geçersizse, en az bir test boş geçecek ve bir tür "geçersiz boş argüman" istisnası / hatası bekleyecek.
En az bir başka test elbette geçerli bir argüman geçirecek - ya da büyük bir diziden geçecek ve on beş geçerli argüman geçecek - ve ortaya çıkan durumun uygun olduğunu onaylayacaktır.
Bir sınama , bu boş argümanı geçmezse ve beklenen istisna ile tokatlanırsa (ve bu istisna, kodun kendisine iletilen durumu savunmacı bir şekilde kontrol ettiği için atıldı), o zaman boş bir sınıfın özelliğine atanmış veya gömülmüş olabilir Olmaması gereken bir tür koleksiyonda.
Bu , yazılım gönderildikten sonra, sınıfın geçtiği sistemin tamamen farklı bir bölgesinde, bazı uzak coğrafi yerel ayarlarda beklenmeyen davranışlara neden olabilir . Ve bu aslında kaçınmaya çalıştığımız bir şey, değil mi?
Daha da kötüsü olabilirdi. Geçersiz durumda olan sınıf örneği yalnızca daha sonra kullanılmak üzere sulandırıldığında bir arızaya neden olmak için serileştirilebilir ve saklanabilir. Tanrım, bilmiyorum, belki bir kapatma işleminden sonra yeniden başlatılamayan bir tür mekanik kontrol sistemidir, çünkü kendi kalıcı konfigürasyon durumunu seri hale getiremez. Veya sınıf örneği seri hale getirilebilir ve başka bir varlık tarafından oluşturulan tamamen farklı bir sisteme geçirilebilir ve bu sistem çökebilir.
Özellikle diğer sistemin programcıları savunmada kodlamadıysa.