Cyklomatisk kompleksitet i softwaretestning med eksempel
โก Smart opsummering
Cyclomatic Complexity er en softwaremetrik udviklet af Thomas McCabe i 1976, der tรฆller de uafhรฆngige stier gennem et program. Den beregnes ud fra en kontrolflowgraf og angiver antallet af testcases, der krรฆves for fuld dรฆkning af grene.

Hvad er McCabes cyklomatiske kompleksitet?
Cyklomatisk kompleksitet i softwaretestning er en testmetrik, der bruges til at mรฅle kompleksiteten af โโet softwareprogram. Det er et kvantitativt mรฅl for uafhรฆngige stier i kildekoden til et softwareprogram. Cyklomatisk kompleksitet kan beregnes ved at bruge kontrolflowgrafer eller med hensyn til funktioner, moduler, metoder eller klasser i et softwareprogram.
Uafhรฆngig sti er defineret som en sti, der har mindst รฉn kant, som ikke er blevet krydset fรธr i nogen andre stier.
Denne metrik blev udviklet af Thomas J. McCabe i 1976, og den er baseret pรฅ en kontrolflow-reprรฆsentation af programmet. Kontrolflow viser et program som en graf, der bestรฅr af noder og kanter.
I grafen reprรฆsenterer noder behandlingsopgaver, mens kanter reprรฆsenterer kontrolflow mellem noderne.
Flowgrafnotation for et program
Flow Graph-notation for et program definerer flere noder forbundet gennem kanterne. Nedenfor er flowdiagrammer for udsagn som if-else, While, indtil og normal sekvens af flow.
Sรฅdan beregnes cyklomatisk kompleksitet
Matematisk fremstilling:
Matematisk set er det et sรฆt af uafhรฆngige stier gennem grafdiagrammet. Code Programmets kompleksitet kan defineres ved hjรฆlp af formlen โ
V(G) = E - N + 2
Hvor,
E โ Antal kanter
N โ Antal noder
V (G) = P + 1
Hvor P = Antal prรฆdikatknuder (node, der indeholder betingelse)
Eksempel -
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;
Flow graf for dette program vil vรฆre
Beregning matematisk,
- V(G) = 9 โ 7 + 2 = 4
- V(G) = 3 + 1 = 4 (Betingelsesknudepunkter er 1,2 og 3 knudepunkter)
Basissรฆt, de fire uafhรฆngige udfรธrelsesstier:
- 1, 7
- 1, 2, 6, 1, 7
- 1, 2, 3, 4, 5, 2, 6, 1, 7
- 1, 2, 3, 5, 2, 6, 1, 7
Egenskaber ved cyklomatisk kompleksitet
Fรธlgende er egenskaberne ved cyklomatisk kompleksitet:
- V (G) er det maksimale antal uafhรฆngige stier i grafen
- V(G) >=1
- G vil have รฉn vej, hvis V (G) = 1
- En almindeligt anvendt retningslinje er at holde V(G) pรฅ 10 eller derunder for et enkelt modul.
Hvordan denne metrik er nyttig til softwaretestning
Basis Path-testning er en af โโWhite Box-teknikkerne, og den garanterer at udfรธre mindst รฉn sรฆtning under testen. Den kontrollerer hver lineรฆrt uafhรฆngig sti gennem programmet, hvilket betyder, at Antallet af nรธdvendige testcases er lig med programmets cyklomatiske kompleksitet.
Denne metrik er nyttig pรฅ grund af egenskaber af cyklomatisk kompleksitet (M) -
- M kan vรฆre antallet af testcases for at opnรฅ grendรฆkning (Upper Bound)
- M kan vรฆre antallet af stier gennem graferne. (Nedre grรฆnse)
Overvej dette eksempel -
If (Condition 1) Statement 1 Else Statement 2 If (Condition 2) Statement 3 Else Statement 4
Cyklomatisk kompleksitet for dette program vil vรฆre 8-7+2=3.
Da kompleksiteten er beregnet til 3, er tre testcases nรธdvendige for at fuldfรธre stidรฆkningen for ovenstรฅende eksempel.
Trin, der skal fรธlges
Fรธlgende trin skal fรธlges for beregning af cyklomatisk kompleksitet og design af testcases.
Trin 1 โ Konstruktion af graf med noder og kanter fra koden
Trin 2 โ Identifikation af selvstรฆndige veje
Trin 3 โ Beregning af cyklomatisk kompleksitet
Trin 4 โ Design af testcases
Nรฅr det grundlรฆggende sรฆt er dannet, TESTCASES skal skrives for at udfรธre alle stierne.
Mere om V (G)
Cyklomatisk kompleksitet kan beregnes manuelt, hvis programmet er lille. Automatiserede vรฆrktรธjer skal bruges, hvis programmet er meget komplekst, da dette involverer flere flowgrafer. Baseret pรฅ kompleksitetstal kan teamet konkludere om de handlinger, der skal tages for at mรฅle.
Fรธlgende tabel giver et overblik over kompleksitetstallet og den tilsvarende betydning af v (G):
| Kompleksitetsnummer | Betydning |
|---|---|
| 1 til 10 |
Struktureret og velskrevet kode Hรธj testbarhed Omkostninger og indsats er mindre |
| 11 til 20 |
Kompleks kode Middel testbarhed Omkostninger og indsats er mellemstore |
| 21 til 40 |
Meget kompleks kode Lav testbarhed Omkostningerne og indsatsen er hรธj |
| > 40 |
Slet ikke testbar Meget hรธje omkostninger og indsats |
Vรฆrktรธjer til beregning af cyklomatisk kompleksitet
Mange vรฆrktรธjer er tilgรฆngelige til at bestemme kompleksiteten af โโapplikationen. Nogle kompleksitetsberegningsvรฆrktรธjer bruges til specifikke teknologier. Kompleksiteten kan findes ved antallet af beslutningspunkter i et program. Beslutningspunkterne er hvis, for, for-each, while, do, catch, case-udsagn i en kildekode.
Eksempler pรฅ vรฆrktรธjer er
- OCLint โ Statisk kodeanalysator til C og relaterede sprog
- SonarQube โ Rapporterer cyklomatisk og kognitiv kompleksitet pรฅ tvรฆrs af mere end 25 sprog
- Visual Studio Code Metrikker โ Indbygget cyklomatisk kompleksitetsanalyse til .NET-assembleringer
- Radon og Lizard โ Kommandolinjekompleksitetsanalysatorer til Python og for henholdsvis flersprogede projekter
- Gmetrics โ Find metrics i Java relaterede applikationer
Anvendelser af cyklomatisk kompleksitet
Cyklomatisk kompleksitet kan vise sig at vรฆre meget nyttig i forhold til
- Hjรฆlper udviklere og testere med at bestemme uafhรฆngige stiudfรธrelser
- Udviklere kan vรฆre sikre pรฅ, at alle stier er blevet testet mindst รฉn gang
- Hjรฆlper os med at fokusere mere pรฅ de afdรฆkkede veje
- Forbedre kodedรฆkning i Software Engineering
- Vurder risikoen forbundet med applikationen eller programmet
- Brug af disse mรฅlinger tidligt i cyklussen reducerer stรธrre risiko for programmet
Sรฅdan reducerer du cyklomatisk kompleksitet
Et hรธjt kompleksitetstal er et signal, ikke en dom. Fire refaktoreringer tegner sig for stรธrstedelen af โโden reduktion, der er opnรฅelig i praksis.
- Extract-metoden. At flytte en gren til sin egen funktion deler kompleksiteten mellem to moduler. Den samlede kompleksitet pรฅ tvรฆrs af systemet er uรฆndret, men hver enhed bliver uafhรฆngigt testbar.
- Erstat en betinget kรฆde med et opslag. En lang if-else-if-stige, der tester den samme variabel, bliver et kort eller en switch, som samler mange beslutningspunkter i รฉt.
- Brug beskyttelsesklausuler. Tidlig returnering af ugyldigt input fjerner den indlejring, som en enkelt stor if-else-blok opretter, uden at รฆndre adfรฆrd.
- Erstat betingede sรฆtninger med polymorfi. Hvor en betinget aktiverer en type, fjerner flytning af hver gren til sin egen klasse beslutningen helt.
Fรธr, med V(G) = 4:
if (user != null) { if (user.isActive()) { if (user.hasRole("admin")) { return grantAccess(); } } } return denyAccess();
Efterfรธlgende, med samme opfรธrsel og fjernet indlejringen:
if (user == null) return denyAccess(); if (!user.isActive()) return denyAccess(); if (!user.hasRole("admin")) return denyAccess(); return grantAccess();
En advarsel om metrikken. Cyklomatisk kompleksitet tรฆller beslutninger, ikke svรฆrhedsgrad. En switch-sรฆtning med tyve simple cases scorer 21, men er let at lรฆse, mens en dybt indlejret blok, der scorer 8, kan vรฆre langt svรฆrere at forstรฅ. Brug tallet til at finde kandidater til gennemgang, ikke som et mรฅl at blive narret med.


.png)
.png)