Kod kapsama oranı: testler kodun ne kadarını çalıştırıyor?
Sözlük

Kod kapsama oranı: testler kodun ne kadarını çalıştırıyor?

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 4 dk okuma

Code coverage, testlerin kodun ne kadarını çalıştırdığını ölçer. Satır, dal ve fonksiyon kapsamı, yüksek oranın yanıltıcı olduğu durumlar ve Jest örneği.

Kod kapsama oranı nedir?

Kod kapsama oranı (code coverage), otomatik testler çalıştırıldığında kaynak kodun ne kadarının fiilen çalıştığını gösteren ölçümdür. Bir fonksiyonun hiçbir test tarafından çağrılmadığını, bir koşulun hiç yanlış koluna girilmediğini bu ölçüm gösterir. Oran yüzde olarak ifade edilir.

Kapsama aracı kodu çalıştırma sırasında izler, hangi satırların, dalların ve fonksiyonların işlendiğini kaydeder ve bir rapor üretir. Bu rapor, testlerin kör noktalarını bulmak için kullanılır. Ölçüm, testin neyi doğruladığını değil, yalnızca neyi çalıştırdığını söyler.

Kapsama türleri

Kapsama ölçümü farklı ayrıntı düzeylerinde yapılır:

  • Satır kapsamı: kaç satırın çalıştığı.
  • İfade (statement) kapsamı: tek satırda birden fazla ifade olabileceğinden satırdan daha ince bir ölçüdür.
  • Fonksiyon kapsamı: kaç fonksiyonun en az bir kez çağrıldığı.
  • Dal (branch) kapsamı: if, else, switch gibi her karar noktasının hem doğru hem yanlış kolunun denenip denenmediği.

Dal kapsamı çoğu zaman en bilgilendirici olanıdır. Bir satır çalışmış görünürken koşulun yalnızca bir kolu denenmiş olabilir. Örneğin "indirim varsa uygula" satırı bir testle çalışmış sayılır, ama indirimin olmadığı durum hiç denenmemiş olabilir; dal kapsamı bu boşluğu gösterir.

Küçük bir örnek

Şu fonksiyonu düşünelim:

function fiyatHesapla(tutar, uyeMi) { if (uyeMi) { return tutar * indirimOrani; } return tutar; }

Tek test yalnızca üye kullanıcıyla yazılırsa, if bloğunun içi çalışır; ancak üye olmayan kolu hiç çalışmaz. Satır kapsamı yüksek görünürken dal kapsamı eksik kalır. Üye olmayan kullanıcı için ayrı bir test eklenince her kol çalıştırılır ve rapor bunu yansıtır.

Jest'te kapsama ölçümü komut satırında coverage bayrağıyla açılır; yapılandırmada hangi dosyaların ölçüleceği collectCoverageFrom, asgari eşik de coverageThreshold ayarlarıyla tanımlanır. Alt sınır sağlanmazsa test komutu hata verir ve bu durum sürekli entegrasyonda yapıyı durdurabilir.

Yüksek kapsama iyi test demek midir?

Hayır. Kapsama, kodun çalıştırıldığını gösterir; doğru sonucun beklendiğini göstermez. Hiçbir doğrulama (assertion) içermeyen bir test, fonksiyonu çağırarak satırları kapsamış sayılabilir. Bu durumda oran yüksek, güvence düşüktür.

Bir ölçü hedef haline gelince kötüye kullanılabilir. Ekipten belirli bir yüzde istendiğinde değer taşımayan testler yazılır, önemli ve zor test edilen kod ise atlanır. Bu yüzden kapsama, hedeften çok bir teşhis aracı olarak kullanılır: düşük kapsamlı bölgeler gözden geçirilir, kritik iş mantığının dal kapsamına dikkat edilir. Testlerin gerçekten hata yakalayıp yakalamadığını anlamak için mutasyon testi gibi tamamlayıcı yaklaşımlar vardır.

Kapsama hedefi nasıl belirlenir?

Herkes için geçerli tek bir doğru yüzde yoktur. Mantıklı bir yaklaşım şunlara dayanır:

  • Kritik alanlara öncelik verilir: ödeme, yetkilendirme, fiyat hesabı gibi hata maliyeti yüksek kodda kapsama beklentisi daha sıkı tutulur.
  • Düşüşü engelleyen eşik konur: mevcut oran geriye gitmesin diye sürekli entegrasyona alt sınır eklenir.
  • Yeni kod için ayrı ölçü kullanılır: değişen satırların kapsamına bakmak, geçmiş borcu yüzünden hedefi imkânsız hale getirmeden kaliteyi korur.
  • Otomatik üretilen, yapılandırma ve basit veri taşıyıcı dosyalar ölçümün dışında bırakılabilir.

Bu seçimlerin ekip içinde yazılı bir ölçüt haline getirilmesi tartışmaları azaltır.

İlişkili kavramlardan farkı

Kod kapsaması test kapsamı (test coverage) ile sık karıştırılır. Test kapsamı daha geniştir; gereksinimlerin, kullanıcı senaryolarının ve risklerin ne kadarının test edildiğini anlatır ve kod ölçümünden bağımsız olabilir. Kod kapsaması ise yalnızca çalıştırılan kod satırlarına bakar.

Birim, entegrasyon ve uçtan uca testlerin hepsi kapsama üretebilir. Ancak birim testlerle yüksek oran yakalamak kolay, gerçek davranışı güvenceye almak ise farklı test katmanlarını gerektirir. Test piramidi bu dengeyi tartışan yaygın bir modeldir.

Mindset programlarında nerede çalışılır?

Test Driven Development (TDD) ve Unit Testing Uzmanlığı Eğitimi programında test kapsamı ve kod kalitesi analizi, mocking ve test izolasyonu, refactoring konuları bir arada işlenir. Yazılım ekiplerinin test alışkanlığı kazanması ve kapsama raporlarını anlamlı okuması için uygundur.

Jest ile JavaScript Birim Testleri programı ise kapsam, TDD ve sürdürülebilirlik modülünde, JavaScript projelerinde kapsama raporunun nasıl okunacağını ve eşiklerin nasıl ayarlanacağını kapsar. Web arayüzü ve Node.js ekipleri için doğrudan uygulanabilir bir konudur.

İlgili Mindset programı

Test Driven Development (TDD) ve Unit Testing Uzmanlığı Eğitimi

Sık sorulanlar

Sık sorulan sorular

Her satırı kapsamak hedeflenmeli mi?

Genellikle hayır. Son kalan kısmı kapsamak için harcanan çaba, kazanılan güvenceden fazla olabilir ve değeri düşük testlere yol açar. Kritik modüllerde yüksek, genel kodda makul bir oran ve düşüşü engelleyen bir alt sınır daha verimli bir yaklaşımdır.

Satır kapsaması ile dal kapsaması arasında hangisi daha önemlidir?

Dal kapsaması çoğu zaman daha bilgilendiricidir, çünkü karar noktalarının her yönünün denenip denenmediğini gösterir. Bir satır çalışmış görünürken yalnızca koşulun bir kolu test edilmiş olabilir. Yine de her türü birlikte izlemek, yarım kalmış testleri yakalamayı kolaylaştırır.

Kapsama raporu hangi dosyaları dışarıda bırakmalıdır?

Otomatik üretilen kodu, saf yapılandırma dosyalarını, giriş noktası dosyalarını ve test dosyalarının kendisini genellikle ölçümden çıkarmak anlamlıdır. Bunlar hem oranı yapay biçimde düşürür hem de gerçek riski göstermez. Araçlar bu dışlamaları yapılandırma dosyasında tanımlama imkânı sunar.

Kapsama ölçümü testleri yavaşlatır mı?

Evet, kodun izlenmesi nedeniyle test koşumu genellikle bir miktar yavaşlar. Bu yüzden birçok ekip kapsamayı her yerel çalıştırmada değil, sürekli entegrasyon hattında ya da belirli aralıklarla ölçer. Hızlı geri bildirim için geliştirme sırasında tek tek test dosyaları kapsama olmadan koşulabilir.

Code Coverage Nedir? Kod Kapsama Oranı Rehberi