Test Coverage Nedir?

Test coverage, yazılım testlerinin, kodun hangi bölümlerini (örneğin, satırları, sınıfları, fonksiyonları) kapsadığını ölçen bir metriktir. Test coverage, yazılım testlerinin kalitesini değerlendirmek için kullanılır.

Test Coverage Türleri

  • Line coverage
  • Branch Coverage
  • Function Coverage
  • Statement Coverage
  • Condition Coverage
  • Requirements Coverage
  • Compatibility Coverage
  • Boundary value Coverage
  • Product Coverage
  • Risk Coverage

Line Coverage (Satır Kapsamı)

  • Line coverage, kodun her bir satırının test edilip edilmediğini ölçen bir metriktir. Bir kod satırı yalnızca bir kez test edildiğinde %100 line coverage’a sahip olunur.
  • Örnek: Bir yazılım projesinde, toplamda 100 satır kod bulunuyor. Testleriniz 95 satırı kapsıyorsa, line coverage %95’tir.

Class Coverage (Sınıf Kapsamı)

  • Bir sınıfın içindeki metodların veya fonksiyonların ne kadarının test edildiğini değerlendirir. Sınıf içindeki metodların her birinin en az bir kere çağrılması gerekliliğini ifade eder.
  • Örnek: Bir sınıfda 4 fonksiyon bulunmakta. Bu 4 fonksiyondan 2’sinin testinin yazıldığını düşünelim. Class coverage %50 olacaktır. Aşağıdaki örnekte Calculator sınıfında 4 adet fonksiyon bulunuyor. Biz 3 fonksiyonun test kodunu yazmışız. O zaman bu sınıf için Class Coverage değeri %75 olur.
class Calculator {
    public function add($a, $b) {
        return $a + $b;
    }

    public function subtract($a, $b) {
        return $a - $b;
    }

    public function multiply($a, $b) {
        return $a * $b;
    }

    public function divide($a, $b) {
        if ($b == 0) {
            throw new Exception("Division by zero is not allowed.");
        }
        return $a / $b;
    }
}

$calculator = new Calculator();

$result = $calculator->add(5, 3);
$expected = 8;
assert($result === $expected, "Add method test failed. Expected $expected, but got $result");

$result = $calculator->subtract(10, 4);
$expected = 6;
assert($result === $expected, "Subtract method test failed. Expected $expected, but got $result");

$result = $calculator->multiply(6, 2);
$expected = 12;
assert($result === $expected, "Multiply method test failed. Expected $expected, but got $result");

echo "All tests passed.";

Function Coverage (Fonksiyon Kapsamı)

  • Function coverage, kodun içerdiği tüm fonksiyonların çağrıldığını kontrol eder. Yani, tüm fonksiyonların test edilmesi gerekir.
  • Örnek: Bir yazılım projesinde toplam 10 farklı fonksiyon bulunuyor. Testleriniz 9 fonksiyonu kapsıyorsa, function coverage %90’dır.

Branch Coverage (Şart Kapsamı)

  • Branch coverage, kodun farklı şartların ve kararların nasıl ele alındığını kontrol eder. Her bir karar noktasının (if-else ifadesi gibi) her iki yolu da kapsamalıdır.
  • Örnek: Bir if-else ifadesi içeren bir kod parçası düşünelim. Branch coverage, her iki şartı da test edildiğinde %100 olur.

Statement Coverage (İfade Kapsamı)

  • Statement coverage, kodun her bir ifadesinin en az bir kez çalıştırıldığını ölçer. Her bir ifade en az bir kez test edilmelidir. İfade , kod içerisindeki her bir işlevsel satırdır.
  • Örnek: Bir kod bloğunda toplam 5 ifade bulunuyor. Testleriniz 4 ifadeyi kapsıyorsa, statement coverage %80’dır.

Condition Coverage (Koşul Kapsamı)

  • Condition coverage, kodun içerdiği tüm koşulların test edilmesini gerektirir. Her bir koşul doğru ve yanlış olarak en az bir kez test edilmelidir.
  • Örnek: Bir kod parçasında toplam 2 farklı koşul ifadesi var. Testleriniz her bir koşulu en az bir kez doğru ve yanlış döndürüyorsa, condition coverage %100’dür. Yani hem if hem else bloğu test edildiyse condition coverage %100’dür.

Requirements Coverage (Gereksinimler Kapsamı)

  • Requirements coverage, yazılımın belirlenen gereksinimleri ne kadar karşıladığını ölçer. Belirlenen gereksinimlerin ne kadarının kod tarafından uygulandığını gösterir.
  • Örnek: Bir yazılımın 50 farklı gereksinimi var ve testleriniz 45 gereksinimi kapsıyorsa, requirements coverage %90’dır.

Diyelim ki bir e-ticaret uygulaması geliştiriyoruz. Bazı gereksinim örnekleri:

Kullanıcıların ürünleri sepete ekleyebilmesi ve satın alabilmesi gerekiyor.

Kullanıcıların ürünleri kategorilere göre filtreleyebilmesi gerekiyor.

Kullanıcılar, hesap oluşturup giriş yapabilmeliler.

Sistem, kullanıcıların alışveriş geçmişini takip etmeli.

Kredi kartıyla ödeme yapabilme seçeneği olmalı.

Sistem hızlı ve güvenli bir şekilde çalışmalı.


Compatibility Coverage (Uyumluluk Kapsamı)

  • Compatibility coverage, yazılımın farklı platformlarda (farklı tarayıcılar, işletim sistemleri vb.) ne kadar iyi çalıştığını ölçer. Farklı platformlarda test edilir ve uyumluluk seviyesi hesaplanır.
  • Örnek: Bir web tarayıcısının farklı sürümlerinde yazılımınızın çalışıp çalışmadığını test ederek uyumluluk coverage hesaplanır. Veya bir mobil yazılımın iphone , android cihazlarla uyumlu olup olmadığını ölçebiliriz.

Boundary Value Coverage (Sınır Değer Kapsamı)

  • Boundary value coverage, yazılımın sınır koşullarını ne kadar iyi ele aldığını ölçer. Genellikle sınırların altında, üstünde ve tam sınırlarda nasıl davrandığını test eder.
  • Bu test ölçümünün arkasındaki fikir, hataların normal aralıktan ziyade girdi aralıklarının kenarlarında meydana gelme olasılığının daha yüksek olmasıdır.
  • Örnek: Bir sayı girişi gerektiren bir yazılımın, belirli bir sınırın altındaki ve üstündeki değerleri test ederek boundary value coverage hesaplayabiliriz.

Diyelim ki bir parola oluşturma uygulaması yazıyorsunuz. Parolaların belirli uzunlukta ve belirli karakter sınırlamalarına sahip olması gerekiyor.

Minimum parola uzunluğu: 8 karakter

Maksimum parola uzunluğu: 16 karakter

Parolalar yalnızca harf ve rakam içerebilir.

Boundary Value Coverage ile bu durumu test etmek için aşağıdaki senaryoları kullanabiliriz:

Test 1: 8 karakter uzunluğunda bir parola gireriz (minimum sınır).

Test 2: 16 karakter uzunluğunda bir parola gireriz (maksimum sınır).

Test 3: 9 karakter uzunluğunda bir parola gireriz (minimum sınırın üstü).

Test 4: 15 karakter uzunluğunda bir parola gireriz (maksimum sınırın altı).

Test 5: 17 karakter uzunluğunda bir parola gireriz (maksimum sınırın üstü).

Test 6: Sadece harf ve rakamları içeren bir parola gireriz.

Test 7: Özel karakter içeren bir parola gireriz (karakter sınırlamasını ihlal eder).

Bu yedi test, parola uzunluğu ve karakter sınırlamalarının sınırlarını ve sınırların içini test eder ve Boundary Value Coverage kapsamını sağlar.


Product Coverage (Ürün Kapsamı)

  • Product coverage, bir yazılımın ne kadar işlevselliğini veya özelliklerini test ettiğinizi ölçer. Bir yazılımın sunması gereken özelliklerin ne kadarının test edildiğini gösterir.Belirli gereksinimleri değil, aynı zamanda uygulamanın tüm işlevselliğini ve kodunu test edildiğini gösterir.
  • Örnek: Bir e-ticaret platformunda kullanıcıların ürünleri sepete ekleyip satın alma işlemini gerçekleştirmesi gerekiyorsa, ürün coverage bu işlemlerin test edilip edilmediğini gösterir.

Risk Coverage (Risk Kapsamı)

  • Risk coverage, yazılım testlerinin sadece kodun işlevselliğini değil, aynı zamanda risklerin nasıl ele alındığını ve yönetildiğini de ölçen bir test stratejisidir.
  • Örnek:

Diyelim ki bir e-ticaret uygulaması geliştiriyoruz. Bu uygulamanın kullanıcıların kişisel bilgilerini ve ödeme bilgilerini sakladığı için güvenlikle ilgili riskler taşıdığınızı fark ettik. Risk coverage stratejisi şunları içerebilir:

SQL Injection Testleri

Kimlik Doğrulama ve Yetkilendirme Testleri

Veri Şifreleme Testleri

Zararlı Dosya Yüklemesi Testleri

Veri Sızdırma Senaryoları Testleri


$x = 15 // 1 
$y = 5 // 2

if ($x > 10)
    $y = $y * 2  // 3
elseif($y > 3 && $x > 15)
    $y = $y + 2 //4

$z = $x + $y //5

Branch Coverage , Condition Coverage ve Statement Coverage Arasındaki Farklar

  1. Statement Coverage: Yukarıdaki kodda toplam 5 ifade bulunuyor.İfade , kod içerisindeki her bir işlevsel satırdır.Yazdığımız testler 4 ifadeyi kapsıyorsa, statement coverage %80’dır. (Yukarıdaki kod örneğinde numaralanmış satırlar birer “ifade” yi ifade etmektedir)
  2. Condition Coverage : Yukarıdaki kodda toplam 2 farklı koşul ifadesi var. Testleriniz her bir koşulu en az bir kez doğru ve yanlış döndürüyorsa, condition coverage %100’dür. Buradaki koşul ifadeleri: x > 10 ve y > 3 ve x > 15 ‘dir .Condition Coverage her bir koşul ifadesini tek tek true ve false olarak test eder.
  3. Branch Coverage : Bir koşul bloğunu (örneğe göre : if-elseif) bloğunun her birinin true ve false testini kontrol eder . Branch coverage, her iki şartı da test edildiğinde %100 olur. Yani x > 10 bloğunun true ve false testinin ayrı ayrı ve (y > 3 && x > 15 ) bloğunu true ve false testini ayrı ayrı kontrol eder.
  4. Condition Coverage de her bir koşulun içindeki ifadeler ayrı ayrı test edilmesi gerekirken Branch coverage de ise koşul bloğunun tamamı (örneğe göre if için ayrı elseif için ayrı) test edilmelidir. Aralarındaki temel fark budur.Mesela $x > 10 için x’i 5 kabul edelim. 5 > 10 false olacağı için bu ifade Branch Coverage için geçerli fakat Condition Coverage için geçerli değildir.

Product Coverage ve Requirements Coverage Arasındaki Farklar

Diyelim ki bir e-ticaret uygulaması geliştiriyoruz ve belirli gereksinimler belirledik:

  • Kullanıcıların ürünleri sepete ekleyebilmesi gerekiyor.
  • Kullanıcıların ürünleri kategorilere göre filtreleyebilmesi gerekiyor.
  • Kullanıcılar, hesap oluşturup giriş yapabilmeliler.
  • Sistem, kullanıcıların alışveriş geçmişini takip etmeli.

Requirements Coverage için, her bir gereksinimin yazılım tarafından ne kadar iyi test edildiğini kontrol ederiz. Örneğin, “Kullanıcılar alışveriş geçmişini takip edebilmeliler” gereksinimini test etmek için kullanıcıların alışveriş geçmişi sayfasına erişim sağlanıp sağlanmadığını ve bu sayfanın doğru çalışıp çalışmadığını test ederiz.

Aynı e-ticaret uygulaması için Product Coverage, sadece belirli gereksinimleri değil, aynı zamanda uygulamanın tüm işlevselliğini ve kodunu test eder. Örneğin, sitede gezinme, ürünleri eklemenin yanı sıra ödeme işlemi, kullanıcı deneyimi, performans ve güvenlik gibi faktörleri de değerlendiririz. Product Coverage, sadece gereksinimlerin ötesine geçip yazılımın genel kalitesini ölçer.


Test Coverage Avantajları

  • Hata Tespitinde Yardımcı Olur: Test coverage, kodun hangi bölümlerinin test edildiğini gösterir. Eksik veya düşük coverage alanları, hataların tespit edilmesi için potansiyel riskleri işaret eder. Test coverage, bu eksiklikleri tespit etmek için kullanılabilir ve hataların erken aşamalarda düzeltilmesine yardımcı olabilir.
  • Güvenilirlik Sağlar: Test coverage, kodun işlevselliğini ve doğruluğunu doğrulamak için kullanılır. Bu sayede yazılımın daha güvenilir ve beklenen şekilde çalışmasına yardımcı olur.
  • Belgelendirme İşlevi Görür: Test coverage, bir kod parçasının nasıl kullanılacağını ve hangi koşullar altında çalışacağını belgeleme işlevi görür. Bu, kodun anlaşılmasını kolaylaştırır ve yeni yazılımcının projeye hızlıca adapte olmalarına yardımcı olur.
  • Kod Kalitesini Artırır: Test coverage, yazılımcının kodlarını daha temiz ve düzenli bir şekilde yazma teşviki sunar. Çünkü test edilebilir kodlar, hata bulma ve bakım süreçlerini daha kolay ve etkili hale getirir.
  • Değişiklik Yönetimini Kolaylaştırır: Mevcut kod tabanını değiştirmek veya güncellemek istediğinizde, test coverage, mevcut işlevselliğin bozulmadığından emin olmanıza yardımcı olur. Bu, değişikliklerin projenin diğer kısımlarına olumsuz etkilerini önler.
  • Takip ve İzleme İmkanı Sunar: Test coverage, proje ilerlemesini takip etmenizi sağlar. Hangi kısımların test edildiğini ve hangi kısımların hala test edilmediğini gösterir. Bu, projenin tamamlanma durumunu daha iyi anlamanıza yardımcı olur.
  • Müşterinin Karşısına En Az Hata İle Çıkılır: İyi test coverage, yazılımın daha düşük hata oranlarına ve daha yüksek kaliteye sahip olmasını sağlar.
  • Riskleri Azaltır: Test coverage, kodun farklı koşullar altında nasıl davrandığını test eder. Bu, beklenmedik hataları ve uygulamaların çökmelerini önleyebilir ve projenin risklerini azaltır.
  • Kodun Yeniden Kullanılabilirliğini Artırır: Test coverage, kod parçalarını bağımsız bir şekilde test edilebilir hale getirir. Bu, bu kod parçalarının başka projelerde veya farklı senaryolarda yeniden kullanılabilirliğini artırır.
  • Yazılımcı Gaza Gelir: Test coverage, geliştiricilere kodlarının doğru çalıştığını ve güvenilir olduğunu gösterir.Buda yazılımcıyı gaza getirebilir.
  • Dökümantasyon: Kodun hangi kısımlarının test edildiğini belgelemeye yardımcı olur. Özellikle büyük projelerde, bu belgeleme önemlidir.
  • CI / CD Süreçlerine Katkı Sağlar

Test Coverage Dezavantajları

  • Güven İstismarı: Yüksek test coverage, kodun büyük bir kısmının test edildiği anlamına gelir, ancak bu testlerin kalitesi ve doğruluğu önemlidir. Yüksek test coverage, testlerin hatalı veya eksik olabileceği gerçeğini göz ardı etmemelidir.
  • Test Ekleme ve Bakım Maliyeti: Yüksek test coverage elde etmek için daha fazla test yazmak ve mevcut testleri güncellemek gerekebilir. Bu, ek maliyetler ve zaman gerektirir. Özellikle büyük ve karmaşık projelerde bu maliyetler artabilir.
  • 100% Test Coverage Israrı: Her kod parçasının test edilmesini hedeflemek, bazen mümkün değildir. Özellikle yazılımın bazı bölümleri örneğin: üçüncü taraf kütüphaneler test edilmesi zor olabilir.
  • Test Yazılımının Kendi Hataları: Testler, yazılımın kendisini test etmek için yazılır. Bu nedenle, test yazılımlarında da hatalar olabilir. Bu hatalar, yanıltıcı sonuçlara veya eksik kapsama alanlarına neden olabilir.
  • Performans Sorunları: Büyük test blokları ve yüksek test coverage, yazılım geliştirme sürecinin performansını olumsuz etkileyebilir. Testlerin uzun çalışma süreleri veya kaynak tüketimi, geliştirme hızını yavaşlatabilir.
  • Kod Değişiklikleri ile Uğraşma: Test coverage yüksekse, her kod değişikliği, ilgili testlerin güncellenmesi gerektirebilir. Bu, yazılımcının daha fazla bakım işlemiyle uğraşmalarına neden olabilir.
  • Gerçek Dünya Senaryolarının Eksikliği: Bazı testler, gerçek dünya senaryolarını tam olarak yansıtmayabilir. Bu nedenle, test coverage yüksek olsa bile, beklenmeyen hatalar gerçek kullanım sırasında ortaya çıkabilir.
  • Mevcut Kodu Test Etmekte Zorluk: Varolan bir projenin test coverage’ını artırmak, bazen zor olabilir. Özellikle eski kod tabanlarında eksik testleri eklemek ve mevcut testleri güncellemek zaman alabilir.
  • Kapsama Metriklerinin Yanıltıcılığı: Test coverage metrikleri, bazen yanıltıcı olabilir. Kodun tamamen test edildiği anlamına gelmez ve bazı testler eksik olabilir

Test Coverage Araçları

Python:

  1. Coverage.py: Python için popüler bir test coverage aracıdır. Kod kapsamını hesaplar ve raporlar oluşturur. Resmi websitesi
  2. pytest-cov: Pytest tabanlı Python projeleri için kullanılan bir test coverage eklentisidir. GitHub sayfası

Java:

  1. JaCoCo (Java Code Coverage): Java projeleri için popüler bir test coverage aracıdır. Java bytecode seviyesinde kod kapsamını izler. Resmi websitesi
  2. Cobertura: Java projeleri için bir başka popüler test coverage aracıdır. Hem kod kapsamı hem de çizelgeleri destekler. GitHub sayfası

PHP:

  1. Xdebug: PHP projeleri için yaygın olarak kullanılan bir debugging aracıdır. Aynı zamanda kod kapsamı izlemeyi de destekler. Resmi websitesi
  2. PHPUnit: PHPUnit, PHP testlerini yazmak ve kod kapsamını ölçmek için kullanılabilir. PHPUnit içerisinde bir kod kapsamı raporu üretebilir. GitHub sayfası

JavaScript:

  1. Istanbul (nyc): JavaScript projeleri için yaygın olarak kullanılan bir test coverage aracıdır. Node.js ve tarayıcı tabanlı projeleri destekler. GitHub sayfası
  2. Jest: Jest, JavaScript projeleri için bir test çerçevesi ve test coverage aracıdır. Kod kapsamını izleyebilir ve raporlar oluşturabilir. GitHub sayfası

C ve C#:

  1. Gcov ©: C ve C++ projeleri için kullanılan GCC (GNU Compiler Collection) ile birlikte gelen bir test coverage aracıdır. Resmi websitesi
  2. OpenCover (.NET/C#): .NET ve C# projeleri için kullanılan bir test coverage aracıdır. Kod kapsamını izler ve raporlar oluşturur. GitHub sayfası

Örnekler


ÖZET

Test Coverage, projemizin genel durumu hakkında istatistiksel bir izleme imkanı sunar. Bu istatistiklerle projemizin risk , ilerleme , güvenirlik durumları hakkında bazı izlenimlere sahip olmamızı sağlar. Bunun yanında yazdığımız kodların işlevselliğini, riskini ve genel durumunuda gösterir. Fakat unutmamak gerekirki; Bu istatistikler bize yüzde yüz kesin ve net çıkarımlar yapmamız gerektiğini söylemez. Fakat Test Coverage araçları, bundan sonra dikkatinizi nereye odaklamanız gerektiğini anlamanıza yardımcı olabilir, ancak mevcut testlerinizin beklenmedik davranışlara karşı yeterince dayanıklı olup olmadığını size söylemezler.

Leave a Reply

Your email address will not be published. Required fields are marked *