Cyklomatická složitost v testování softwaru s příkladem
⚡ Chytré shrnutí
Cyklomatická složitost je softwarová metrika vyvinutá Thomasem McCabem v roce 1976, která počítá nezávislé cesty programem. Vypočítává se z grafu toku řízení a udává počet testovacích případů potřebných pro úplné pokrytí větví.

Co je McCabeova cyklomatická složitost?
Cyklomatická složitost v testování softwaru je testovací metrika používaná pro měření složitosti softwarového programu. Je to kvantitativní měření nezávislých cest ve zdrojovém kódu softwarového programu. Cyklomatickou složitost lze vypočítat pomocí grafů řídicích toků nebo s ohledem na funkce, moduly, metody nebo třídy v rámci softwarového programu.
Nezávislá dráha je definována jako dráha, která má alespoň jednu hranu, která dosud nebyla projeta v žádné jiné cestě.
Tuto metriku vyvinul Thomas J. McCabe v roce 1976 a je založena na reprezentaci řídicího toku programu. Řídicí tok zobrazuje program jako graf, který se skládá z uzlů a hran.
V grafu uzly představují úlohy zpracování, zatímco hrany představují řídicí tok mezi uzly.
Zápis grafu toku pro program
Zápis Flow Graph pro program definuje několik uzlů spojených hranami. Níže jsou vývojové diagramy pro příkazy jako if-else, While, till a normální sekvence toku.
Jak vypočítat cyklomatickou složitost
Matematické znázornění:
Matematicky se jedná o množinu nezávislých cest grafem diagramu. Code Složitost programu lze definovat pomocí vzorce –
V(G) = E - N + 2
Kde,
E – Počet hran
N – Počet uzlů
V (G) = P + 1
Kde P = počet predikátových uzlů (uzel, který obsahuje podmínku)
Příklad -
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;
Vývojový diagram pro tento program bude
Počítat matematicky,
- V(G) = 9 – 7 + 2 = 4
- V(G) = 3 + 1 = 4 (uzly podmínky jsou 1,2, 3 a XNUMX uzly)
Základní sada, čtyři nezávislé cesty provádění:
- 1, 7
- 1, 2, 6, 1, 7
- 1, 2, 3, 4, 5, 2, 6, 1, 7
- 1, 2, 3, 5, 2, 6, 1, 7
Vlastnosti cyklomatické složitosti
Níže jsou uvedeny vlastnosti cyklomatické složitosti:
- V (G) je maximální počet nezávislých cest v grafu
- V (G) >=1
- G bude mít jednu cestu, pokud V (G) = 1
- Běžně používaným pravidlem je udržovat V(G) na hodnotě 10 nebo nižší pro jeden modul.
Jak je tato metrika užitečná pro testování softwaru
Testování základních cest je jednou z technik bílé skříňky a zaručuje provedení alespoň jednoho příkazu během testování. Kontroluje každou lineárně nezávislou cestu programem, což znamená, že počet potřebných testovacích případů se rovná cyklomatické složitosti programu.
Tato metrika je užitečná kvůli vlastnostem cyklomatické složitosti (M) –
- M může být počet testovacích případů k dosažení pokrytí větví (horní hranice)
- M může být počet cest přes grafy. (dolní hranice)
Zvažte tento příklad –
If (Condition 1) Statement 1 Else Statement 2 If (Condition 2) Statement 3 Else Statement 4
Cyklomatická složitost pro tento program bude 8-7+2=3.
Vzhledem k tomu, že složitost byla vypočtena jako 3, jsou nutné tři testovací případy k úplnému pokrytí cesty pro výše uvedený příklad.
Kroky, které je třeba dodržet
Při výpočtu cyklomatické složitosti a návrhu testovacích případů je třeba dodržet následující kroky.
Krok 1 – Konstrukce grafu s uzly a hranami z kódu
Krok 2 – Identifikace nezávislých cest
Krok 3 – Výpočet cyklické složitosti
Krok 4 – Návrh testovacích případů
Jakmile je vytvořena základní sada, TESTOVACÍ PŘÍPADY by měl být zapsán tak, aby provedl všechny cesty.
Více o V (G)
Cyklomatickou složitost lze vypočítat ručně, pokud je program malý. Je-li program velmi složitý, je třeba použít automatizované nástroje, protože zahrnuje více vývojových grafů. Na základě čísla složitosti může tým dojít k závěru o akcích, které je třeba provést pro měření.
Následující tabulka poskytuje přehled o čísle složitosti a odpovídajícím významu v(G):
| Číslo složitosti | Význam |
|---|---|
| 1 10 na |
Strukturovaný a dobře napsaný kód Vysoká testovatelnost Náklady a úsilí jsou nižší |
| 11 20 na |
Složitý kód Střední testovatelnost Náklady a úsilí jsou střední |
| 21 40 na |
Velmi složitý kód Nízká testovatelnost Náklady a úsilí jsou vysoké |
| > 40 |
Vůbec ne testovatelné Velmi vysoké náklady a úsilí |
Nástroje pro výpočet cyklomatické složitosti
Pro stanovení složitosti aplikace je k dispozici mnoho nástrojů. Pro specifické technologie se používají některé nástroje pro výpočet složitosti. Složitost lze nalézt podle počtu rozhodovacích bodů v programu. Rozhodovacími body jsou příkazy if, for, for-each, while, do, catch, case ve zdrojovém kódu.
Příklady nástrojů jsou
- OCLint – Analyzátor statického kódu pro C a příbuzné jazyky
- SonarQube – Zaznamenává cyklomatickou a kognitivní složitost ve více než 25 jazycích
- Visual Studio Code Metriky – Vestavěná cyklomatická analýza složitosti pro sestavení .NET
- Radon a Lizard – Analyzátory složitosti z příkazového řádku pro Python a pro vícejazyčné projekty
- GMetrics – Najděte metriky v Java související aplikace
Použití cyklomatické složitosti
Cyklomatická složitost se může ukázat jako velmi užitečná
- Pomáhá vývojářům a testerům určit nezávislá provedení cesty
- Vývojáři mohou zaručit, že všechny cesty byly alespoň jednou otestovány.
- Pomáhá nám více se soustředit na odkryté cesty
- Zlepšete pokrytí kódu v Softwarové inženýrství
- Vyhodnoťte riziko spojené s aplikací nebo programem
- Použití těchto metrik na začátku cyklu snižuje větší riziko programu
Jak snížit cyklomatickou složitost
Vysoké číslo složitosti je signál, nikoli verdikt. Většinu snížení, kterého je v praxi možné dosáhnout, představují čtyři refaktoringy.
- Extracmetoda t. Přesunutí větve do vlastní funkce rozdělí složitost mezi dva moduly. Celková složitost v celém systému se nezmění, ale každá jednotka se stane nezávisle testovatelnou.
- Nahraďte podmíněný řetězec vyhledáváním. Dlouhý žebřík if-else-if testující stejnou proměnnou se stává mapou nebo přepínačem, který shlukuje mnoho rozhodovacích bodů do jednoho.
- Používejte ochranné klauzule. Včasné vrácení hodnoty při neplatném vstupu odstraní vnoření, které vytváří jeden velký blok if-else, aniž by se změnilo chování.
- Nahraďte podmíněné výrazy polymorfismem. Pokud podmíněná operace přepíná na typ, přesunutí každé větve do vlastní třídy toto rozhodnutí zcela odstraní.
Předtím, s V(G) = 4:
if (user != null) { if (user.isActive()) { if (user.hasRole("admin")) { return grantAccess(); } } } return denyAccess();
Poté, se stejným chováním a odstraněním vnoření:
if (user == null) return denyAccess(); if (!user.isActive()) return denyAccess(); if (!user.hasRole("admin")) return denyAccess(); return grantAccess();
Upozornění ohledně metriky. Cyklomatická složitost počítá rozhodnutí, nikoli obtížnost. Příkaz switch s dvaceti jednoduchými případy má skóre 21, přesto se snadno čte, zatímco hluboce vnořený blok s hodnocením 8 může být mnohem obtížněji srozumitelný. Použijte toto číslo k nalezení kandidátů k přezkoumání, ne jako cíl, který lze obelstít.


.png)
.png)