Kod kapsamı nedir ve bunu nasıl ölçersiniz?


275

Kod kapsamı nedir ve bunu nasıl ölçersiniz?

Otomatik test kodu kapsamımızla ilgili bu soru soruldu. Öyle görünüyor ki, otomatik araçların dışında bilimden daha fazla sanat var. Kod kapsamının nasıl kullanılacağına dair gerçek dünyadan örnekler var mı?

Yanıtlar:


242

Kod kapsamı, otomatik testler çalışırken kodunuzun kaç satırının / bloğunun / yayının yürütüldüğünün bir ölçümüdür.

Kod kapsamı, izleme çağrıları eklemek ve enstrümanlı ürüne karşı tam otomatik testler yürütmek için ikili dosyaları enstrüman haline getirmek için özel bir araç kullanılarak toplanır. İyi bir araç, yalnızca yürütülen kodun yüzdesini değil, aynı zamanda verileri incelemenizi ve belirli bir test sırasında tam olarak hangi kod satırlarının yürütüldüğünü görmenizi sağlar.

Ekibimiz, kurum içi kod kapsamı araçları seti olan Magellan'ı kullanıyor . Bir .NET mağazasıysanız, Visual Studio kod kapsamını toplamak için tümleşik araçlara sahiptir. Bu makalede anlatıldığı gibi bazı özel araçları da döndürebilirsiniz .

Bir C ++ mağazasıysanız, Intel'in Windows ve Linux için çalışan bazı araçları var, ancak onları kullanmadım. Ayrıca GCC için gcov aracının olduğunu duydum, ancak bunun hakkında hiçbir şey bilmiyorum ve size bir bağlantı veremiyorum.

Nasıl kullandığımızla ilgili olarak - kod kapsamı, her kilometre taşı için çıkış ölçütlerimizden biridir. Aslında üç kod kapsamı ölçümümüz var - birim testlerden (geliştirme ekibinden), senaryo testlerinden (test ekibinden) ve birleşik kapsama.

BTW, kod kapsamı ne kadar test yaptığınız için iyi bir metrik olsa da, ürününüzü ne kadar iyi test ettiğinizin iyi bir metriği olması gerekmez. Kaliteyi sağlamak için kod kapsamı ile birlikte kullanmanız gereken başka metrikler de vardır.


40
"Kaliteyi sağlamak için kod kapsamı ile birlikte kullanmanız gereken başka metrikler de var." Bu diğer metriklerin ne olduğunu söyleyebilir misiniz?
Troopers

Ayrıca Testwell CTC ++ kullanabilirsiniz , C, C ++, C # ve Java için oldukça eksiksiz bir kod kapsama aracıdır
B_PRIEUR

1
@Abdul Kod kapsamını ölçerken, her iki tür testi de çalıştırmalı ve kod kapsamını ayrı ayrı ölçmelisiniz. "Kod yayları" gelince - bunlar if / then gibi kod yürütme dallarıdır.
Franci Penov

1
@Maverick çoğu kişi kod kapsamı konuşurken birim testini üstlenir, ancak Microsoft'ta hem birim testlerinden hem de entegrasyon testlerinden kod kapsamını ölçüyoruz.
Franci Penov

1
@darth_coder genellikle hiçbir şey. Uygulama da otomatik olarak enstrümante edilmeyecek ve enstrümantasyon verilerini toplayan hiçbir şey yoksa, yeni uygulamanın varlığı önemsizdir. İşleri etkileyebileceği tek durum, uygulamanın otomatik testler çalışırken aynı anda çalışması ve enstrümanlı OS kodunun test otomasyonu ile aynı süreç içinde çalışmasına neden olması ve böylece bazı işletim sistemi kodlarının çalıştırılıyor olarak gösterilmesidir. testlerden etkilenmedi.
Franci Penov

189

Kod kapsamı temel olarak kodunuzun ne kadarının testler kapsamında olduğunu test eder. Yani,% 90 kod kapsamına sahipseniz, testlerin kapsamında olmayan kodun% 10'u olduğu anlamına gelir. Kodun% 90'ının kapsantığını düşünüyor olabileceğinizi biliyorum, ancak farklı bir açıdan bakmak zorundasınız. % 100 kod kapsamı almanızı engelleyen nedir?

Buna iyi bir örnek verilecektir:

if(customer.IsOldCustomer()) 
{
}
else 
{
}

Şimdi, yukarıdaki kodda iki yol / dal vardır. Her zaman "EVET" dalına vuruyorsanız, diğer kısmı kapsamazsınız ve Kod Kapsamı sonuçlarında gösterilir. Bu iyi çünkü artık neyin kapsanmadığını biliyorsunuz ve diğer kısmı kapsamak için bir test yazabilirsiniz. Kod kapsamı yoksa, patlamak için bir bomba üzerinde oturuyorsunuz.

NCover , kod kapsamını ölçmek için iyi bir araçtır.


5
En iyi cevap, neredeyse 10 yıl önce! Lanet olsun! :)
Nikos

4
Basit ve anlamlı cevap :)
Parveen

Evet. Mantıklı olan tek kişi. Her ne kadar aşağı kaydırmaya devam etsem bile. Burası durdum. Yer işaretli.
TheRealChx101

64

Unutmayın, "% 100 kod kapsamına" sahip olmak her şeyin tamamen test edildiği anlamına gelmez - her kod satırının test edildiği anlamına gelir, ancak her (ortak) durumda test edildiği anlamına gelmez.

Muhtemelen testler yazmanız gereken kod parçalarını vurgulamak için kod kapsamını kullanırdım. Örneğin, geçerli birim testlerimi çalıştırırken myImportantFunction () 'i gösteren herhangi bir kod kapsama aracı çalıştırılmazsa, muhtemelen geliştirilmeleri gerekir.

Temel olarak,% 100 kod kapsamı, kodunuzun mükemmel olduğu anlamına gelmez. Daha kapsamlı (birim) testler yazmak için bir rehber olarak kullanın.


1
- "% 100 kod kapsamı" her şeyin tamamen test edildiği anlamına gelmez - her kod satırı test edilir, her (ortak) durumda test edildikleri anlamına gelmez ..- " durum "veri girişi ve parametreleri açısından mı? Her şey test edilirse, neden tamamen test edilmek anlamına gelmediğini anlamakta zorluk çekiyorum.
Abdul

20
Kodunuzun her satırı testlerinizde bir noktada çalıştırıldığından, kodun çalıştırılabileceği olası her senaryoyu test ettiğiniz anlamına gelmez. Eğer almış xve geri dönen bir fonksiyonunuz x/xvarsa ve testi my_func (2) kullanarak çalıştırdıysanız (fonksiyonun kodu çalıştırılacağı için)% 100 kapsama sahip olursunuz, ancak 0 parametre olduğunda büyük bir sorunu kaçırdınız. Yani , % 100 kapsam dahilinde bile gerekli tüm senaryoları test etmediniz.
steve

Tüm testler için Birim test senaryoları yazılmadığında lütfen bu duruma bakabilir misiniz? Kod kapsamı hala% 100 olacak mı? stackoverflow.com/questions/43395968/…
Sachin Kumar

52

Önceki cevapların birçoğuna birkaç noktayı tamamlamak:

Kod kapsamı, test kümenizin kaynak kodunuzu ne kadar iyi kapsadığı anlamına gelir. yani test kodu kümesinin kaynak kodunun kapsamı.

Yukarıdaki yanıtlarda belirtildiği gibi, yollar, koşullar, işlevler, ifadeler vb. Gibi çeşitli kapsam kriterleri vardır.

  1. Koşul kapsamı: Tüm boole ifadeleri doğru ve yanlış olarak değerlendirilir.
  2. Karar kapsamı: Yalnızca bir kez doğru ve yanlış için değerlendirilecek boole ifadeleri değil, başka if-elseif gövdesini de kapsayacak şekilde.
  3. Döngü Kapsamı: her olası döngüyü bir kez, birden fazla ve sıfır kez yürüttüğü anlamına gelir. Ayrıca, maksimum limit varsayımımız varsa, mümkünse maksimum limit sürelerini ve maksimum limit sürelerinden bir tanesini test edin.
  4. Giriş ve Çıkış Kapsamı: Tüm olası çağrıları ve dönüş değerlerini test edin.
  5. Parametre Değer Kapsamı (PVC). Bir parametrenin tüm olası değerlerinin test edilip edilmediğini kontrol etmek için. Örneğin, bir dize yaygın olarak şunlardan biri olabilir: a) null, b) boş, c) boşluk (boşluk, sekmeler, yeni satır), d) geçerli dize, e) geçersiz dize, f) tek baytlık dize, g ) çift baytlık dize. Her olası parametre değerinin test edilmemesi bir hata bırakabilir. Bunlardan yalnızca birinin test edilmesi, her satır kapsandığı için% 100 kod kapsamına neden olabilir, ancak yedi seçenekten yalnızca biri test edildiğinden, parametre değerinin yalnızca% 14.2 kapsamı anlamına gelir.
  6. Kalıtım Kapsamı: Nesneye yönelik kaynak durumunda, temel sınıf tarafından belirtilen türetilmiş bir nesneyi döndürürken, kardeş nesnenin iade edilip edilmediğini değerlendirmek için kapsam test edilmelidir.

Not: Statik kod analizi, erişilemeyen bir kod veya asılı kod olup olmadığını, yani başka bir işlev çağrısı kapsamına girmeyen kodu bulur. Ve ayrıca diğer statik kapsama. Statik kod analizi% 100 kodun kapsandığını rapor etse bile, olası tüm kod kapsamı test edilirse, test setiniz hakkında rapor vermez.


2
Diğer cevaplara güzel bir ek
HDave

15

Kod kapsamı, önceki cevaplarda iyi açıklanmıştır. Bu daha çok sorunun ikinci kısmına bir cevap.

Kod kapsamını belirlemek için üç araç kullandık.

  1. JTest - JUnit üzerine inşa edilmiş tescilli bir araç. (Birim testleri de üretir.)
  2. Cobertura - raporlar oluşturmak için JUnit testleri ile kolayca birleştirilebilen bir açık kaynak kod kapsama aracı.
  3. Emma - başka - birim testten biraz farklı bir amaç için kullandığımız bu. Web uygulamasına son kullanıcılar tarafından erişildiğinde kapsama raporları oluşturmak için kullanılmıştır. Bu, web test araçlarıyla birleştiğinde (örnek: Canoo), tipik son kullanıcı kullanımı sırasında ne kadar kodun kapsandığını gösteren çok kullanışlı kapsama raporları verebilir.

Bu araçları

  • Geliştiricilerin iyi birim testleri yazdıklarını gözden geçirin
  • Kara kutu testi sırasında tüm kodların çevrildiğinden emin olun

6

Kod kapsamı, test edilen kodun bir ölçüsüdür. Ölçülebilen çeşitli kapsam kriterleri vardır, ancak genellikle bir program içindeki toplam kapsamı oluşturan çeşitli yollar, koşullar, fonksiyonlar ve ifadelerdir. Kod kapsamı metriği, bu kapsam ölçütlerinin her birini yürüten testlerin yalnızca bir yüzdesidir.

Projelerimdeki ünite test kapsamını nasıl izlediğime gelince, takip etmek için statik kod analiz araçlarını kullanıyorum.


5

Perl için modüllerimde düzenli olarak kullandığım mükemmel Devel :: Cover modülü var.

Yapı ve kurulum Module :: Build tarafından yönetiliyorsa ./Build testcover, hangi kod yolunun kapsanmadığını görmenizi kolaylaştıran güzel renklerle, alt, çizgi ve koşul başına kapsama alanı anlatan güzel bir HTML sitesi almak için çalıştırabilirsiniz .


1

Önceki cevaplarda Kod kapsamı iyi açıklanmıştır. Sadece üzerinde çalışıyorsanız araçlar iOSve OSXplatformlar hakkında bazı bilgiler ekliyorum , Xcode kod kapsamı test etmek ve izlemek için tesis sağlar.

Referans Bağlantıları:

https://developer.apple.com/library/archive/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/07-code_coverage.html

https://medium.com/zendesk-engineering/code-coverage-and-xcode-6b2fb8756a51

Her ikisi de Xcode ile kod kapsamını öğrenmek ve keşfetmek için faydalı linklerdir.


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.