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.
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.
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.
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:
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:
- V (G), grafikteki maksimum bağımsız yol sayısıdır
- V(G)>=1
- V (G) = 1 ise G'nin bir yolu olacaktır
- 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 –
- M, dal kapsamına ulaşmak için test senaryolarının sayısı olabilir (Üst Sınır)
- 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.



.png)



.png)