“Yeterli” ne kadar Kod Kapsamı var?


37

İşimde burada kod kapsamı için bir itme başlatıyoruz ve bu beni düşünmeye itiyor. Ne kadar kod kapsamı yeterli?

Kod kapsamındaki azalan getirilere ne zaman ulaşırsınız? İyi kapsama alanı ile yeterince olmayan arasındaki tatlı nokta nedir? Yapmakta olduğunuz projenin türüne göre değişiyor mu (yani WPF, WCF, Mobile, ASP.NET) (Bunlar yazdığımız C # sınıflarıdır.)


Buna gerçekten iyi bir cevap yok; Artima Developer forumlarında " Ne Kadar Birim Test Kapsama İhtiyacınız Var? "
RN01

Yanıtlar:


19

En az % 70 hedefliyoruz . Daha kolay test edilebilir olan şeylerde (örneğin, işlevsel veri yapıları),% 90'ı hedefliyoruz ve çoğu kişi mümkün olduğu kadar% 100'e yakınını hedefliyor. WPF ile ilgili şeyler ve test edilmesi zor olan diğer çerçevelerde, çok daha düşük kapsama alıyoruz (ancak% 70).


WPF'nin doğal olarak test etmesi zor mu yoksa daha iyi bir kapsama alanı elde etmek için en iyi stratejiyi bulmak için çaba harcamamış mısınız?
JBRWilkinson

Birçoğu WPF girişinin takılmasının zor olmasından kaynaklanmaktadır. Testlerimiz, elde edebileceğimiz en fazla birim-y veya API-y'dir ve WPF'in (en azından girdi) en üstünde yer alan katmanı kolayca takma yetersizliği testi zorlaştırır. API’nin GUI dışı bölümlerinin test edilmesi kolay olduğu için büyük bir sorun değil, ancak modelimizden (veya görünüm modelinden) zorlu olan WPF’ye giden son süreç.
Noah Richards

1
Evet, WPF test edilecek bir kaltak. Ve görünümlerde bağları kontrol etmek için derleme zamanı olsaydı bununla yaşayabilirdim. Dolayısıyla, görünümün bağlandığı bir özelliği değiştirirseniz, en azından derleme yapılamaz. Ama öyle değil. Bu, GUI otomasyonunu kabul testlerimizde kullanmamıza neden oldu; Ancak en azından sistemin çalıştığı konusunda bize güven veriyor.
Pete

Numarayı beğendim (% 70). Takımlarım büyüdükçe, kapsama alanı için değere göre testler bulmaya başladım. WPF yorumunda biz sadece başlangıç ​​günlerindeyiz. Yani, WPF kodunu kolayca test edilebilecek şekilde yapılandırmıyoruz. Sahte modeller yardımcı olur. Kod tasarlarken, test edilebilir olarak tasarlayın. Ve, evet, bu noktada sınırlı örnekler var, bu yüzden düşüneceksiniz. Çoğu geliştiricinin TDD olarak tanımlandığından farklı değil, ilk kez onlara daha az endüstri deneyimi kazandırıldı.
Jim Rush,

Daha spesifik olmak gerekirse, WPF ünite testi için bir sürtüktür , eğer bir sebepten daha fazla kapsamaya ihtiyacınız varsa, WPF sınıflarının kapsama alınmasının en kolay yolu kodlu UI testleri / entegrasyon testleridir
jk.

55

Ben sadece kod kapsamının kötü bir ölçüm olduğu kanısındayım. Örneğin, kodu kapsayan tonlarca işe yaramaz testler üretmek kolaydır , ancak çıktıyı yeterince kontrol etmeyin veya örneğin son vakaları test etmeyin. Kodu kapatmak sadece bir istisna atmadığı, doğru olmadığı anlamına gelir. Kalite testlerine ihtiyacınız var - miktar o kadar önemli değil.


8
Kod Kapsamı, otomatik yapı sisteminizde gerçekleştirilen otomatik testlerinizin çıktılarından biri olmalıdır. Çıktıyı kontrol etmeyen testlerin yapılması zor. Eşiğin altındaki kapsam, testlerin yetersiz / yetersiz olduğu yeni özellikleri gösterir. İnsanları yenecek bir şey olmamalı - ama kesinlikle denenmemiş kodları işaretleyebilir.
JBRWilkinson

3
Ben burada ikinci JBRWilkinson, iyi bir kod göstergesi olmasa da, kod kapsamı testlerin eksikliğinin bir göstergesi olabilir. Ünite testleriniz, performans ölçütleri gibi diğer ölçümleri de sağlayabilir, böylece beklenmedik iş yükü altında yeni bir sürüm sunucuyu çökertince aniden şaşırmazsınız.
Matthieu M.

4
Bence bu yanlış bir seçim. Yalnızca az miktarda koda dokunan yüksek kaliteli testler, büyük miktarda koda dokunan, ancak sonuçları gerçekten kontrol etmeyen "testler" gibi genel kalite ölçütlerinin düşüklüğüdür. Başka bir deyişle, ön sürücü tarafındaki tekerleği test etmek için çok kapsamlı olan ve arabanın başka bir parçası olmayan araçlar için bir kalite güvence süreci hayal edin. Bu, sadece bütün arabayı izleyen ve "evet, iyi görünüyor" diyen bir QA işlemi ile aynı şekilde kötü olurdu.
Noah Richards,

38

"Yeter", kodunuzda hiçbir şeyi bozmadığınıza güvenerek değişiklik yapabileceğiniz zamandır. Bazı projelerde, bu% 10, diğerlerinde ise% 95 olabilir.

Neredeyse hiç bir zaman% 100 kadar yüksek değil. Bununla birlikte, bazen% 100 kod kapsamı almaya çalışmak, kod tabanından hırsızlığı gidermenin harika bir yolu olabilir. Kod kapsamını arttırmanın iki yolu olduğunu unutmayın - daha fazla test yazın veya kodu alın. Kodun test edilmesi zor olduğu için kod kapsamazsa, test etmeyi kolaylaştırmak için basitleştirmeniz veya yeniden yapılandırmanız iyi bir ihtimaldir. Sınamak için çok zahmetli ise, genellikle kodda başka hiçbir şeyin kullanmaması iyi bir ihtimaldir.


24
"Korku can sıkana kadar test et"
Brad Mace

2
Kod kaldırmayla ilgili yorum için oy verin. Her zaman bunun için kod kapsamı ölçümlerini kullanıyorum (VS'de kaplanmayan satırları vurguladığı yerde).
Noah Richards,

Büyük teklif @bemace
jayraynet

14

Kod kapsamı asimptotik olarak% 100'e yaklaşır. Sonuç olarak, harcanan efor için ufak tefek küçük kazançlar elde etmeye başladığınızdan, bu son% 5 muhtemelen değerinden daha fazla efor harcar.


7

Kapsama bir göz tutmak için bir ölçüt, ancak nihai hedefi olmamalıdır. Çok fazla yüksek kapsam kodu gördüm - ve kuşkusuz yazdım! -% 100 kapsam (tabii TDD), henüz:

  • böcek hala ortaya çıkıyor
  • tasarım hala zayıf olabilir
  • keyfi bir kapsama alanı için ateş ederek kendinizi gerçekten öldürebilirsiniz - savaşlarınızı seçin: p

Burada referans almanın uygun olduğunu düşündüğüm bir "Testivus Yolu" girişi var :)


5

Çoğu kodun yalnızca % 20'si zamanın% 80'ini çalıştıracaktır . Bir kod kapsamı analizi, en çok neyin test edilmesi gerektiğini belirlemek için bir arama grafiği ile eşleşmediği sürece çok kullanışlı değildir . Bu, size en yakın davaların nerede olacağını gösterir. Sadece gerçek kodun% 5'inden azını oluşturan bu uç durumlar için 100 test gerçekleştirebilirsiniz.

Bu nedenle, kritik yolları tanımlayan% 20'nin% 100'ünü ve geri kalanının en az% 50'sini (arama grafiğine göre) kapladığınızdan emin olun. Bu size (kabaca)% 70 -% 75 toplam kapsama alanı sağlamalıdır, ancak değişebilir.

Kritik son durum kasalarını kontrol etmeden bırakırken toplamda% 70'in üzerinde kapsama alanı almaya çalışırken zaman kaybetmeyin.


Kod Kapsamı araçları, tanım gereği bir Çağrı Grafiği oluşturmuyor mu?
JBRWilkinson

4

Kapsamı test edilmemiş alanları belirtmek için kılavuz olarak kullanın. Kapsam için bir yetki belgesine sahip olmak yerine, kapsamayan kodun nedenini anlamak daha akıllıca olacaktır. Eksikliğin bir sebebini kaydetmek, risklerin dengelenmesini sağlayan iyi bir disiplindir.

Bazen sebep arzu edilenden daha azdır, örneğin 'zaman tükenmiştir' ancak erken tahliye için uygun olabilir. Daha sonra kapsama alanını artırmak için bölgeleri işaretlemek daha iyidir.

% 100 ekstre kapsamının kritik olmayan sistemler için uygun olduğu düşünülen kritik uçuş yazılımları üzerinde çalışıyorum. Daha kritik sistemler için şube / karar kapsamını kontrol ediyoruz ve bazen yeterince katı olmayan bir teknik çağrı MC / DC kullanıyoruz.

Ayrıca nesne kodunu da korumamızı sağlamalıyız.

Bizim durumumuzda risk / değer arasında çok yüksek bir risktir. Hata bulma riskine dayanarak bilinçli bir seçime ihtiyaç vardır.


3

Daha fazla kod kapsamı sağlamak için çalışma süresi performansını, güvenliği, esnekliği veya bakımını etkileyebilecek değişiklikleri göz önünde bulundurmaya başladığınızda, daha fazla kod kapsamı arayışı sona erme zamanıdır.

Bu noktanın% 0 olduğu projelere sahibim, çünkü tasarıma ve bunun% 92 kadar yüksek olduğu diğer projelere zarar vermeden hesaplamak mümkün değil.

Kod kapsamı ölçümleri yalnızca bazı testleri kaçırmış olabileceğinizi belirtmek için kullanışlıdır. Size testlerinizin kalitesi hakkında hiçbir şey söylemezler.


2

Uzay kritik yazılımı% 100 beyan kapsamı gerektirir.

İlk başta hiçbir anlamı yok. Herkes tam bir test kapsamının, kodun tamamen test edildiği ve uygulamayı gerçekten test etmeden% 100 kapsam almanın zor olmadığı anlamına geldiğini herkes bilir.

Bununla birlikte,% 100 kapsama alanı daha düşük bir sınırdır:% 100 kapsama alanı hatasız bir yazılımın kanıtı olmamasına rağmen, daha az kapsama alanıyla kodun tamamen test edilmediğinden ve bunun yalnızca kritik alan yazılımı için kabul edilemez olduğu kesindir.


2

@ RevBingo'nun cevabını gerçekten seviyorum, çünkü% 100'e karşı mücadelenin kullanılmayan kodu temizlemenize veya silmenize neden olabileceğini öne sürüyor. Diğer cevaplarda görmediğim şey, ne zaman yüksek kapsamaya ihtiyaç duyduğunuza ve ne zaman ihtiyaç duymadığınıza bağlı. Bunu başlatırken bir bıçak aldım. Bunun gibi bir grafiğe ayrıntı eklemek, tüm kodlar için doğru olan bir test kapsamı numarası bulmaktan daha yararlı bir takip olacaktır.

100%

Java.util Collections gibi halka açık bir API için, bir Veritabanına bağlı değildir ve HTML döndürmez, zaman veya% 90-95'e razı olsanız bile,% 100 kapsamın asil bir başlangıç ​​hedefi olduğunu düşünüyorum. kısıtlamaları. Tam özellikli olduktan sonra test kapsamını artırmak, diğer kod inceleme türlerine göre daha ayrıntılı bir inceleme düzeyi zorlar. Eğer API’niz çok popülerse, insanlar onu kullanacak, alt sınıflandıracak, seri hale getirecek, vb. Bekleyemezsiniz. İlk deneyimlerinin bir hata bulmasını ya da tasarım gözetimini istemiyorsunuz!

% 90

Veri yapılarını alan ve veri yapılarını döndüren iş altyapısı kodu için,% 100 hala muhtemelen iyi bir başlangıç ​​hedefidir, ancak bu kod çok fazla suistimali davet edecek kadar açık değilse, belki% 85 hala kabul edilebilir mi?

% 75

Dizeleri alan ve döndüren kodlar için birim testinin çok daha kırılgan olduğunu düşünüyorum, ancak yine de birçok durumda yararlı olabilir.

% 50 veya daha az

HTML döndüren işlevler için test yazmaktan nefret ediyorum çünkü çok kırılgan. Birisi CSS’i, JavaScript’i veya döndürdüğünüz tüm HTML ve İngilizce bloğunu insan son kullanıcılarına bir anlam ifade etmiyorsa ne olur? Küçük bir HTML üretmek için çok fazla iş mantığı kullanan bir işlev bulabilirseniz, bu test edilmeye değer olabilir. Ancak bunun tersi durum hiç denenmeye değer olmayabilir.

0% civarında

Bazı kodlar için "doğru" tanımı "son kullanıcı için anlamlıdır" dır. Otomatik dilbilgisi denetimi veya çıktısını doğrulayan HTML gibi bu koda karşı yapabileceğiniz geleneksel olmayan testler vardır. Sık sık işyerinde avlandığımız küçük tutarsızlıklar için grep ifadeleri bile ayarladım, sistemin geri kalanı "Giriş Yap" dediğinde "Giriş" demek gibi. Bu adam kesinlikle bir ünite testi değil, belirli bir çıktı beklemeden sorunları yakalamanın yararlı bir yolu.

Sonuçta, ancak bir insan, insana duyarlı olanı yargılayabilir. Birim testi size orada yardımcı olamaz. Bazen bunu doğru bir şekilde değerlendirmek için birkaç insan gerekir.

Mutlak% 0

Bu üzücü bir kategori ve onu yazmak için daha az insan gibi hissediyorum. Ancak, yeterince büyük olan herhangi bir projede, herhangi bir ticari fayda sağlamadan insan haftalarını emen tavşan delikleri vardır.

Bir kitap satın aldım, çünkü Hazırda Bekletme durumunu sınamak için verilerin otomatik olarak nasıl alay edildiğini gösterdiğini iddia etti. Ancak yalnızca Hazırda Beklet HQL ve SQL sorgularını test etti. Çok fazla HQL ve SQL yapmak zorundaysanız, gerçekten Hazırda Bekletme avantajından yararlanamazsınız. Bir tür Hazırda Bekletme belleği veritabanı var, ancak testlerde etkin olarak nasıl kullanılacağını bulmak için zaman harcamamıştım. Çalışıyor olsaydım, Hazırda Bekletme'nin bazı sorguları çalıştırmasına neden olan bir nesne grafiğinde gezinerek işleri hesaplayan herhangi bir iş mantığı için yüksek (% 50 -% 100) test kapsamı olmasını isterdim. Bu kodu test etme yeteneğim şu anda% 0 civarında ve bu bir sorun. Bu yüzden projenin diğer alanlarındaki test kapsamını iyileştiriyorum ve büyük ölçüde bu fonksiyonlar için testler yazmak daha kolay olduğu için veritabanına erişenlerin yerine saf fonksiyonları tercih etmeye çalışıyorum. Yine de,


1

Test ettiğiniz uygulamanın bir kısmına bağlı olduğunu düşünüyorum. Örneğin, iş mantığı veya karmaşık veri dönüşümleri içeren herhangi bir bileşen için,% 90 (mümkün olduğunca yüksek) kapsamı hedeflerim. Sıklıkla küçük ancak tehlikeli hataları, kodun mümkün olduğu kadar çok test edilmesini sağladım. Test sırasında bu tür hataları bulmayı tercih ederim, bir yıl sonra müşterinin sitesinde oluşmasına izin vermek yerine. Ayrıca, yüksek kod kapsamının yararı, testlerin buna göre uyarlanması gerektiğinden insanların çalışma kodunu kolayca değiştirmelerini engellemesidir.

Öte yandan, kod kapsamının daha az uygun olduğu bileşenler olduğunu düşünüyorum. Örneğin, bir GUI'yi test ederken, olayı doğru bileşenlere göndermek için bir düğmeye tıklandığında yürütülen tüm kodu kapsayan bir test yazmak çok zaman alır. Bu durumda, sadece butona tıkladığınız ve programın davranışını gözlemlediğiniz manuel bir test gerçekleştirme geleneksel yaklaşımını kullanmak çok daha etkilidir (doğru iletişim penceresi açılır mı? ?).


0

Test süitinizin ne zaman yeterli kapsama alanına sahip olduğunu bilmek için bir kod kapsamı olarak kullanma konusunda yüksek bir fikrim yok.

Bunun temel nedeni, önce bazı kodları yazdığınız bir işlem, daha sonra bazı testler yaptığınız ve ardından bir testi kaçırdığınız yeri bulmak için kod kapsamına bakmanızdır, o zaman iyileştirilmesi gereken işlem sizsiniz. Doğru TDD yaparsanız, kutudan% 100'lük bir kod kapsamı vardır (kuşkusuz, test etmediğim bazı önemsizlikler vardır). Ancak ne test edeceğinizi öğrenmek için kod kapsamına bakarsanız, yanlış testler yazmanız olasıdır.

Bu nedenle, kod kapsamından çıkarabileceğiniz tek şey, eğer çok düşükse, yeterli testinizin olmamasıdır. Ancak yüksekse, tüm doğru testlere sahip olmanızın garantisi yoktur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.