it-swarm.dev

Ekler veya birim testleri daha mı önemli?

Hem varsayımlar hem de birim testleri, bir kod tabanı ve hataları keşfetmenin bir aracı olarak hizmet eder. Temel farklılıklar, varsayımların akıl sağlığı kontrolleri olarak işlev görmesi ve gerçek girdileri görmesi, ünite testleri ise belirli simüle edilmiş girdiler üzerinde çalışır ve iyi tanımlanmış tek bir "doğru cevaba" karşı testlerdir. Doğruluğu doğrulamanın ana yolu olarak varsayımlara karşı birim testlerini kullanmanın göreceli değerleri nelerdir? Hangisinin daha fazla vurgulanması gerektiğine inanıyorsunuz?

52
dsimcha

Ekler size programın dahili durum hakkında bilgi vermek için kullanışlıdır. Örneğin, veri yapılarınızın geçerli bir durumu vardır, örneğin, bir Time veri yapısının 25:61:61 Değerini içermeyeceği. Eklerin kontrol ettiği koşullar:

  • Arayanın sözleşmesini sürdürmesini sağlayan ön koşullar,

  • Callee'nin sözleşmesini muhafaza etmesini sağlayan son koşullar ve

  • İşlev döndükten sonra veri yapısının her zaman bir özelliği tutmasını sağlayan değişmezler. Değişmez, bir ön koşul ve bir son koşul olan bir koşuldur.

Birim testleri size modülün dış davranışı hakkında bilgi vermek için kullanışlıdır. Stack, Push() yöntemi çağrıldıktan sonra tutarlı bir duruma sahip olabilir, ancak yığının boyutu üç kez çağrıldıktan sonra üç kat artarsa, bu bir hatadır. (Örneğin, yanlış Push() uygulamasının yalnızca ekleri ve çıkışları kontrol ettiği önemsiz durum.)

Açıkçası, ekler ve birim testleri arasındaki en büyük fark birim testlerinin test verisi vardır (programın çalışmasını sağlayacak değerler), ancak ileri sürmez. Yani, iddialar için aynısını söyleyemeseniz de, birim testlerinizi otomatik olarak gerçekleştirebilirsiniz. Bu tartışma uğruna, programı üst düzey fonksiyon testleri bağlamında yürüttüğünüzden bahsettim (tüm programı yürüten ve birim testleri gibi modülleri çalıştırmayan). Otomatik fonksiyon testlerinden "gerçek girdileri görme" aracı olarak bahsetmiyorsanız, değer açıkça otomasyonda yatar ve böylece birim testleri kazanır. Bunun hakkında (otomatik) işlev testleri bağlamında konuşuyorsanız, aşağıya bakın.

Test edilenler arasında bir miktar örtüşme olabilir. Örneğin, Stack 'ın son koşulu aslında yığın boyutunun bir tane arttığını iddia edebilir. Ancak bu iddiada neler yapılabileceğine dair sınırlamalar vardır: Üst öğenin henüz eklenen şey olup olmadığını da kontrol etmeli mi?

Her ikisi için de amaç kaliteyi arttırmaktır. Birim testi için amaç hataları bulmaktır. İddialar için amaç, geçersiz program durumlarını meydana gelir gelmez gözlemleyerek hata ayıklamayı kolaylaştırmaktır.

hiçbir tekniğinin doğruluğunu doğrulamadığını unutmayın. Aslında, programın doğru olduğunu doğrulamak için birim testi yaparsanız, muhtemelen çalışacağını bildiğiniz ilginç olmayan bir test bulacaksınız. Bu psikolojik bir etki: hedefinize ulaşmak için ne gerekiyorsa yapacaksınız. Amacınız hataları bulmaksa, etkinlikleriniz bunu yansıtacaktır.

Her ikisi de önemlidir ve kendi amaçları vardır.

[İddianameler hakkında son bir not olarak: En fazla değeri elde etmek için, bunları birkaç temel fonksiyonda değil, programınızdaki tüm kritik noktalarda kullanmanız gerekir. Aksi takdirde, sorunun orijinal kaynağı maskelenmiş ve saatlerce hata ayıklama yapmadan algılanması zor olabilir.]

43
Macneil

İddialar hakkında konuşurken, bir anahtar dokunuşuyla kapatılabileceklerini unutmayın.

Çok kötü bir iddia örneği:

char *c = malloc(1024);
assert(c != NULL);

Bu neden kötü? Çünkü NDEBUG gibi bir şey tanımlandığından bu iddia atlanırsa hiçbir hata kontrolü yapılmaz.

Birim testi, yukarıdaki kodda (muhtemelen) sadece segfault olur. Elbette, bir şeylerin yanlış gittiğini söyleyerek işini yaptı ya da yaptı mı? malloc() testinde başarısız olma olasılığı nedir?

İddialar, bir programcının hiçbir 'normal' olayın iddianın tetiklenmesine neden olmayacağını ima etmesi gerektiğinde hata ayıklama amaçları içindir. malloc() başarısız, aslında normal bir olaydır, bu nedenle asla iddia edilmemelidir.

Yanlış gidebilecek şeyleri yeterince işlemek yerine iddiaların kullanıldığı başka durumlar da vardır. Bu nedenle iddialar kötü bir üne sahiptir ve Go gibi diller neden içermez.

Birim testleri, değiştirdiğiniz bir şeyin başka bir şeyi kırdığını size bildirmek için tasarlanmıştır. Programın her özelliğinden (çoğu durumda test kullanıcıları sürümler için sürümler için önemlidir) (çoğu durumda) sizi kurtarmak için tasarlanmıştır. bir yapı.

Gerçekten ikisi arasında belirgin bir ilişki yok, ikisi de bir şeylerin yanlış gittiğini söylüyor. Bir iddiayı, bir hata ayıklayıcı kullanmak zorunda kalmadan üzerinde çalıştığınız bir şeyin kırılma noktası olarak düşünün. Bir birim testini, üzerinde çalışmadığınız bir şeyi bozup bozmadığınızı söyleyen bir şey olarak düşünün.

7
Tim Post

Her ikisi de, inşa ettiğiniz sistemin genel kalitesini iyileştirmek için kullanılan araçlardır. Çoğu, kullandığınız dile, oluşturduğunuz uygulamanın türüne ve zamanınızın en iyi nerede harcandığına bağlıdır. Bu konuda birkaç düşünce okulunuz olduğundan bahsetmiyorum bile.

Başlamak için, assert anahtar kelimesi olmayan bir dil kullanıyorsanız, ekleri kullanamazsınız (en azından burada konuştuğumuz şekilde değil). Uzun zamandır Java bir assert anahtar kelimesi yoktu ve bazı diller hala mevcut değil. Daha sonra birim testi biraz daha önemli hale geliyor. iddialar yalnızca bir bayrak ayarlandığında çalıştırılır (yine Java burada). Korumalar her zaman orada olmadığında, çok kullanışlı bir özellik değildir.

Bir şey "iddia ediyorsanız", bir if/throw anlamlı bir istisna bloğu da yazabileceğinizi söyleyen bir düşünce okulu vardır. Bu düşünce süreci, tüm değerlerin sınırlar içinde olmasını sağlamak için bir yöntemin başlangıcına yerleştirilen birçok varsayımdan gelir. Ön koşullarınızı test etmek, beklenen bir son koşula sahip olmanın çok önemli bir parçasıdır.

Birim testi, yazılması ve bakımı gereken ekstra koddur. Çoğu için bu bir dezavantajdır. Bununla birlikte, mevcut birim test çerçevelerinin kırpılmasıyla, nispeten az kodla daha fazla sayıda test koşulu oluşturabilirsiniz. Parametrelenmiş testler ve "teoriler", aynı testi bulmak zor olan çok sayıda veri örneği ile gerçekleştirecektir.

Şahsen, ünite testi ile serpme iddialarından daha fazla kilometre aldığımı fark ettim, ancak çoğu zaman geliştirdiğim platformlar nedeniyle (Java/C #). Diğer dillerde daha güçlü bir iddia desteği ve hatta daha fazla garanti sağlamak için "Sözleşme ile Tasarım" (aşağıya bakınız) bulunmaktadır. Bu dillerden biriyle çalışsaydım, DBC'yi birim testinden daha fazla kullanabilirdim.

http://en.wikipedia.org/wiki/Design_by_contract#Languages_with_native_support

5
Berin Loritsch