Debug.Assert'in doğru seçim olabileceği dört vaka daha ekleyeceğimi düşündüm.
1) Burada bahsetmediğim bir şey, Eklemelerin otomatik test sırasında sağlayabileceği ek kavramsal kapsamdır . Basit bir örnek olarak:
Bazı üst düzey arayanlar, kodun kapsamını ek senaryoları ele alacak şekilde genişlettiklerine inanan bir yazar tarafından değiştirildiğinde, ideal olarak (!) Bu yeni koşulu kapsayacak şekilde birim testleri yazacaklardır. Bu durumda tam entegre kod düzgün çalışıyor gibi görünebilir.
Bununla birlikte, aslında ince bir kusur ortaya çıktı, ancak test sonuçlarında tespit edilmedi. Bu durumda callee belirleyici olmaz ve sadece beklenen sonucu verir. Ya da belki de fark edilmeyen bir yuvarlama hatası verdi. Veya başka bir yerde eşit olarak dengelenen bir hataya neden oldu. Veya yalnızca istenen erişim değil, verilmemesi gereken ek ayrıcalıklar da verildi. Vb.
Bu noktada, callee'de yer alan Debug.Assert () ifadeleri, birim testleri tarafından çalıştırılan yeni vaka (veya kenar durumu) ile birleştiğinde, test sırasında orijinal yazarın varsayımlarının geçersiz kılındığına ve kodun ek inceleme yapılmadan yayınlanabilir. Birim testleri ile zenginleştirmeler mükemmel ortaklardır.
2) Ek olarak, bazı testlerin yazılması kolaydır, ancak ilk varsayımlar dikkate alındığında yüksek maliyetlidir ve gereksizdir . Örneğin:
Bir nesneye yalnızca belirli bir güvenli giriş noktasından erişilebiliyorsa, arayanın izinleri olduğundan emin olmak için her nesne yönteminden bir ağ hakları veritabanına ek bir sorgu yapılmalı mıdır? Kesinlikle hayır. Belki de ideal çözüm, önbellekleme veya özelliklerin başka bir şekilde genişletilmesini içerir, ancak tasarım bunu gerektirmez. Nesne güvenli olmayan bir giriş noktasına eklendiğinde hemen bir Debug.Assert () gösterilir.
3) Daha sonra, bazı durumlarda ürününüz, serbest bırakma modunda dağıtıldığında işlemlerinin tümü veya bir kısmı için yararlı bir tanı etkileşimi olmayabilir . Örneğin:
Diyelim ki gömülü bir gerçek zamanlı cihaz. İstisnalar atmak ve hatalı biçimlendirilmiş bir paketle karşılaştığında yeniden başlatmak karşı üretkendir. Bunun yerine, cihaz, çıkışında gürültü yaratma noktasına kadar en iyi çabadan yararlanabilir. Ayrıca, bir insan arabirimi, kayıt cihazı olmayabilir veya serbest bırakma modunda dağıtıldığında insan tarafından fiziksel olarak erişilebilir olmayabilir ve hataların farkındalığı en iyi şekilde aynı çıktı değerlendirilerek sağlanır. Bu durumda, liberal iddialar ve kapsamlı tahliye öncesi testler istisnalardan daha değerlidir.
4) Son olarak, bazı testler sadece callee'nin son derece güvenilir olduğu için gereksizdir . Çoğu durumda, yeniden kullanılabilir kod ne kadar çoksa, güvenilir hale getirmek için o kadar fazla çaba harcanır. Bu nedenle, arayanlardan beklenmeyen parametreler için Exception'da yaygındır, ancak callees'ten beklenmeyen sonuçlar için Assert kullanılır. Örneğin:
Bir çekirdek String.Find
işlem -1
arama ölçütleri bulunmadığında bir geri döneceğini bildirirse , üç yerine bir işlemi güvenli bir şekilde gerçekleştirebilirsiniz. Ancak, gerçekte geri döndüyse -2
, makul bir hareket tarzınız olmayabilir. Daha basit hesaplamayı, bir -1
değeri ayrı ayrı test eden bir hesapla değiştirmek yararsızdır ve çoğu sürüm ortamında kodlarınızı çekirdek kütüphanelerin beklendiği gibi çalıştığından emin olmak için test etmek için mantıksızdır. Bu durumda Eklemler idealdir.