Yazılım Testinde Döngüsel Karmaşıklık (Örneklerle)

⚡ Akıllı Özet

Döngüsel Karmaşıklık, Thomas McCabe tarafından 1976'da geliştirilen ve bir programdaki bağımsız yolları sayan bir yazılım ölçütüdür. Kontrol akış grafiğinden hesaplanır ve tam dal kapsamı için gereken test senaryolarının sayısını verir.

  • 📐 İki Formül: Grafikten V(G) = E – N + 2 veya karar noktalarının sayısından V(G) = P + 1 elde edilir.
  • 🧮 Doğrudan Anlamı: Bu değer, bağımsız yolların maksimum sayısına ve dolayısıyla ihtiyaç duyulan test durumlarının sayısına eşittir.
  • 🗺️ Grafik Temeli: Düğümler işlem adımlarını, kenarlar ise bunlar arasındaki kontrol akışını temsil eder.
  • 🟢 1 - 10: Yapılandırılmış, iyi yazılmış, yüksek test edilebilirliğe ve düşük bakım maliyetine sahip kod.
  • 🟠 21 - 40: Test edilebilirliği düşük, oldukça karmaşık kodlar; burada yeniden düzenleme genellikle test etmekten daha ucuzdur.
  • ️ takım: SonarQube, Visual Studio Code Metrics, Radon ve Lizard bunu otomatik olarak hesaplıyor.

Yazılım Testinde Siklomatik Karmaşıklık

McCabe'nin Siklomatik Karmaşıklığı Nedir?

Yazılım Testinde Siklomatik Karmaşıklık bir yazılım programının karmaşıklığını ölçmek için kullanılan bir test metriğidir. Bir yazılım programının kaynak kodundaki bağımsız yolların nicel bir ölçüsüdür. Döngüsel karmaşıklık, kontrol akış grafikleri kullanılarak veya bir yazılım programındaki işlevler, modüller, yöntemler veya sınıflar açısından hesaplanabilir.

Bağımsız yol, daha önce başka yollardan geçilmemiş en az bir kenarı olan yol olarak tanımlanır.

Bu metrik, 1976 yılında Thomas J. McCabe tarafından geliştirilmiştir ve programın kontrol akışı temsiline dayanmaktadır. Kontrol akışı, bir programı Düğümler ve Kenarlardan oluşan bir grafik olarak gösterir.

Grafikte, Düğümler işleme görevlerini temsil ederken kenarlar, düğümler arasındaki kontrol akışını temsil eder.

McCabe'nin Siklomatik Karmaşıklığı

Bir Program için Akış Şeması Gösterimi

Bir programın Akış Grafiği gösterimi, kenarlardan bağlanan birkaç düğümü tanımlar. Aşağıda if-else, While, Until ve normal akış sırası gibi ifadeler için Akış diyagramları bulunmaktadır.

Bir program için akış grafiği gösterimi

#1 EN İYİ GENEL OLARAKKüresel Uygulama Testi
9.8/ 10
★ ★ ★ ★ ★
Ücretsiz Demo Alın
PractiTest
9.5/ 10
★ ★ ★ ★ ★
Ziyaret edin PractiTest
Testiny
9.3/ 10
★ ★ ★ ★ ★
Ziyaret edin Testiny
EnKitlesel Test ve Kalite GüvencesiTest YönetimiKüçük ve Orta Ölçekli Kalite Güvence Ekipleri
Key Feature✓Üçüncü taraf entegrasyon testi✓Merkezi test yönetimi✓Manuel + otomatik test senaryoları
Entegrasyonlar✓Jira, Slack, TestRail✓Jira, Jenkins, Slack✓Jira, GitHub, GitLab
Ücretsiz denemeÜcretsiz demo14-Day Ücretsiz DenemeÜcretsiz demo
Ücretsiz Demo AlınZiyaret edin PractiTestZiyaret edin Testiny

Siklomatik Karmaşıklık Nasıl Hesaplanır

Matematiksel gösterim:

Matematiksel olarak, grafik diyagramındaki bağımsız yollar kümesidir. Code Programın karmaşıklığı şu formül kullanılarak tanımlanabilir:

V(G) = E - N + 2

Nerede,

E – Kenar sayısı

N – Düğüm Sayısı

V (G) = P + 1

Burada P = Yüklem düğümlerinin sayısı (koşul içeren düğüm)

Örnek -

i = 0;
n=4; //N-Number of nodes present in the graph

while (i<n-1) do
j = i + 1;

while (j<n) do

if A[i]<A[j] then
swap(A[i], A[j]);

end do;
j=j+1;

end do;

Bu programın akış grafiği şu şekilde olacaktır:

Siklomatik Karmaşıklığı Hesapla

Matematiksel hesaplama,

  • V(G) = 9 – 7 + 2 = 4
  • V(G) = 3 + 1 = 4 (Koşul düğümleri 1,2 ve 3 düğümdür)

Temel setDört bağımsız yürütme yolu:

  • 1, 7
  • 1, 2, 6, 1, 7
  • 1, 2, 3, 4, 5, 2, 6, 1, 7
  • 1, 2, 3, 5, 2, 6, 1, 7

Döngüsel Karmaşıklığın Özellikleri

Siklomatik karmaşıklığın özellikleri şunlardır:

  1. V (G), grafikteki maksimum bağımsız yol sayısıdır
  2. V(G)>=1
  3. V (G) = 1 ise G'nin bir yolu olacaktır
  4. Genellikle kullanılan bir kılavuz, tek bir modül için V(G)'yi 10 veya altında tutmaktır.

Bu Ölçüt Yazılım Testinde Nasıl Faydalıdır?

Temel yol testi, beyaz kutu tekniklerinden biridir ve test sırasında en az bir ifadenin çalıştırılmasını garanti eder. Programdaki her doğrusal bağımsız yolu kontrol eder, yani Gerekli test senaryosu sayısı, programın döngüsel karmaşıklığına eşittir..

Bu metrik, Siklomatik karmaşıklığın (M) özelliklerinden dolayı yararlıdır –

  1. M, dal kapsamına ulaşmak için test senaryolarının sayısı olabilir (Üst Sınır)
  2. M, grafiklerdeki yolların sayısı olabilir. (Alt sınır)

Bu örneği düşünün –

If (Condition 1)
Statement 1

Else
Statement 2

If (Condition 2)
Statement 3

Else
Statement 4

Bu program için Siklomatik Karmaşıklık 8-7+2=3 olacaktır.

Karmaşıklık 3 olarak hesaplandığından, yukarıdaki örnek için tam yol kapsamı için üç test vakası gereklidir.

İzlenecek adımlar

Siklomatik karmaşıklığın hesaplanması ve test senaryolarının tasarımı için aşağıdaki adımlar izlenmelidir.

1. Adım – Koddan düğümler ve kenarlar içeren grafiğin oluşturulması

2. Adım – Bağımsız yolların belirlenmesi

3. Adım – Siklomatik Karmaşıklık Hesaplaması

4. Adım – Test Durumlarının Tasarımı

Temel küme oluşturulduktan sonra, TEST ÖRNEKLERİ tüm yolları çalıştıracak şekilde yazılmalıdır.

V (G) hakkında daha fazlası

Program küçükse, döngüsel karmaşıklık manuel olarak hesaplanabilir. Program çok karmaşıksa, daha fazla akış grafiği içerdiğinden otomatik araçlar kullanılmalıdır. Karmaşıklık sayısına dayanarak, ekip ölçüm için yapılması gereken eylemler hakkında sonuca varabilir.

Aşağıdaki tablo, karmaşıklık sayısına ve v(G)'nin karşılık gelen anlamına genel bir bakış sunmaktadır:

Karmaşıklık Sayısı anlam
1 için 10

Yapılandırılmış ve iyi yazılmış kod

Yüksek test edilebilirlik

Maliyet ve çaba daha azdır.

11 için 20

Karmaşık kod

Orta düzeyde test edilebilirlik

Maliyet ve emek orta düzeydedir.

21 için 40

Çok karmaşık kod

Düşük test edilebilirlik

Maliyet ve emek yüksektir.

> 40

Hiç test edilemez

Çok yüksek maliyet ve çaba

Döngüsel Karmaşıklığı Hesaplama Araçları

Uygulamanın karmaşıklığını belirlemek için birçok araç mevcuttur. Bazı karmaşıklık hesaplama araçları belirli teknolojiler için kullanılır. Karmaşıklık, bir programdaki karar noktalarının sayısına göre bulunabilir. Karar noktaları, bir kaynak kodundaki if, for, for-each, while, do, catch, case ifadeleridir.

Araç örnekleri şunlardır:

  • OCLint – C ve İlgili Diller için statik kod analizörü
  • SonarQube – 25'ten fazla dilde döngüsel ve bilişsel karmaşıklığı rapor eder.
  • Visual Studio Code Metrikler – .NET derlemeleri için yerleşik döngüsel karmaşıklık analizi
  • Radon ve Lizard – Komut satırı karmaşıklık analiz araçları Python ve çok dilli projeler için sırasıyla
  • GMetrikler – Metrikleri bulun Java ilgili uygulamalar

Döngüsel Karmaşıklığın Kullanımları

Siklomatik Karmaşıklık, çok faydalı olabilir

  • Geliştiricilerin ve test uzmanlarının bağımsız yol yürütmelerini belirlemelerine yardımcı olur
  • Geliştiriciler, tüm yolların en az bir kez test edildiğinden emin olabilirler.
  • Keşfedilmemiş yollara daha fazla odaklanmamıza yardımcı olur
  • Kod kapsamını iyileştirin Yazılım Mühendisliği
  • Uygulama veya programla ilişkili riski değerlendirin
  • Bu metriklerin döngünün başlarında kullanılması programın daha fazla riskini azaltır

Döngüsel Karmaşıklığı Nasıl Azaltabiliriz?

Yüksek karmaşıklık sayısı bir sinyaldir, bir yargı değil. Pratikte elde edilebilecek azalmanın büyük kısmı dört yeniden düzenlemeyle sağlanabilir.

  • ExtracYöntem. Bir dalı kendi fonksiyonuna taşımak, karmaşıklığı iki modül arasında böler. Sistem genelindeki karmaşıklık değişmez, ancak her birim bağımsız olarak test edilebilir hale gelir.
  • Koşullu zinciri bir arama işlemiyle değiştirin. Aynı değişkeni test eden uzun bir if-else-if yapısı, birçok karar noktasını tek bir noktada birleştiren bir map veya switch yapısına dönüşür.
  • Koruma maddeleri kullanın. Geçersiz girdi durumunda erken dönüş yapmak, davranışı değiştirmeden tek bir büyük if-else bloğunun oluşturduğu iç içe geçmeyi ortadan kaldırır.
  • Koşullu ifadeleri polimorfizmle değiştirin. Bir türe bağlı koşullu switch ifadelerinde, her bir dalı kendi sınıfına taşımak, karar verme işlemini tamamen ortadan kaldırır.

Öncesinde, V(G) = 4 iken:

if (user != null) {
    if (user.isActive()) {
        if (user.hasRole("admin")) {
            return grantAccess();
        }
    }
}
return denyAccess();

Sonrasında, aynı davranış biçimiyle ve iç içe geçme kaldırıldıktan sonra:

if (user == null) return denyAccess();
if (!user.isActive()) return denyAccess();
if (!user.hasRole("admin")) return denyAccess();
return grantAccess();

Ölçüm yöntemiyle ilgili bir uyarı. Döngüsel karmaşıklık, zorluğu değil, kararları sayar. Yirmi basit durum içeren bir switch ifadesi 21 puan alır ve okunması kolaydır; buna karşılık, derinlemesine iç içe geçmiş bir blok 8 puan alabilir ve anlaşılması çok daha zor olabilir. Sayıyı, gözden geçirilecek adayları bulmak için kullanın, manipüle edilecek bir hedef olarak değil.

SSS

Modül başına on veya daha az kod, genel kılavuzdur. 11 ile 20 arasında kod karmaşık ancak yönetilebilir durumdadır. 20'nin üzerinde test edilebilirlik keskin bir şekilde düşer ve 40'ın üzerinde modül genellikle yazıldığı haliyle test edilemez olarak kabul edilir.

İkisi de aynı sonucu verir. P + 1, elle hesaplama için daha hızlıdır çünkü yalnızca karar noktalarını sayarsınız. E – N + 2 ise araçların kullandığı formüldür, çünkü kontrol akış grafiğini zaten oluşturmuşlardır.

Mutlaka öyle değil. Döngüsel karmaşıklık, zorluktan ziyade kararları sayar; bu nedenle, yirmi basit durum içeren düz bir anahtar, okunması kolay kalırken yüksek puan alır. Sayıyı bir gözden geçirme hatırlatıcısı olarak değerlendirin.

Değişiklik sıklığı ve hata geçmişini birleştirerek hangi modüllerin en fazla risk taşıdığını sıralıyorlar ve inceleme ve test çalışmalarını başarısız olma olasılığı en yüksek olan koda yönlendiriyorlar.

Evet. Yapay zekâ asistanları koruma maddeleri önerir, örneğintracSayıyı azaltan yöntemler ve arama tabloları kullanın. Mantığı değiştiren bir yeniden düzenleme amacın dışına çıkacağından, davranışı mevcut test paketiyle doğrulayın.

Bu yazıyı şu şekilde özetleyin: