Cyklomatisk komplexitet i mjukvarutestning med exempel
โก Smart sammanfattning
Cyclomatic Complexity รคr ett programvarumetrikat som utvecklades av Thomas McCabe 1976 och som rรคknar de oberoende vรคgarna genom ett program. Det berรคknas frรฅn ett kontrollflรถdesdiagram och ger antalet testfall som krรคvs fรถr full grentรคckning.

Vad รคr McCabes cyklomatiska komplexitet?
Cyklomatisk komplexitet i mjukvarutestning รคr ett testmรฅtt som anvรคnds fรถr att mรคta komplexiteten hos ett program. Det รคr ett kvantitativt mรฅtt pรฅ oberoende sรถkvรคgar i kรคllkoden fรถr ett program. Cyklomatisk komplexitet kan berรคknas genom att anvรคnda styrflรถdesgrafer eller med avseende pรฅ funktioner, moduler, metoder eller klasser inom ett program.
Oberoende bana definieras som en bana som har minst en kant som inte har korsat tidigare i nรฅgra andra banor.
Detta mรฅtt utvecklades av Thomas J. McCabe 1976 och รคr baserat pรฅ en kontrollflรถdesrepresentation av programmet. Kontrollflรถdet visar ett program som en graf som bestรฅr av noder och kanter.
I grafen representerar noder bearbetningsuppgifter medan kanter representerar kontrollflรถdet mellan noderna.
Flรถdesgrafnotation fรถr ett program
Flรถdesgrafnotation fรถr ett program definierar flera noder kopplade genom kanterna. Nedan finns flรถdesdiagram fรถr pรฅstรฅenden som if-else, While, tills och normal flรถdessekvens.
Hur man berรคknar cyklomatisk komplexitet
Matematisk representation:
Matematiskt sett รคr det en uppsรคttning oberoende banor genom grafdiagrammet. Code Programmets komplexitet kan definieras med hjรคlp av formeln โ
V(G) = E - N + 2
Var,
E โ Antal kanter
N โ Antal noder
V (G) = P + 1
Dรคr P = Antal predikatnoder (nod som innehรฅller villkor)
Exempel -
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;
Flรถdesdiagram fรถr detta program kommer att vara
Berรคkna matematiskt,
- V(G) = 9 โ 7 + 2 = 4
- V(G) = 3 + 1 = 4 (villkorsnoder รคr 1,2, 3 och XNUMX noder)
Grunduppsรคttning, de fyra oberoende exekveringsvรคgarna:
- 1, 7
- 1, 2, 6, 1, 7
- 1, 2, 3, 4, 5, 2, 6, 1, 7
- 1, 2, 3, 5, 2, 6, 1, 7
Egenskaper hos cyklomatisk komplexitet
Fรถljande รคr egenskaperna hos cyklomatisk komplexitet:
- V (G) รคr det maximala antalet oberoende vรคgar i grafen
- V (G) >=1
- G kommer att ha en vรคg om V (G) = 1
- En vanlig riktlinje รคr att hรฅlla V(G) pรฅ 10 eller lรคgre fรถr en enskild modul.
Hur denna mรคtmetrik รคr anvรคndbar fรถr programvarutestning
Basis Path-testning รคr en av White Box-teknikerna och garanterar att minst en sats kรถrs under testningen. Den kontrollerar varje linjรคrt oberoende sรถkvรคg genom programmet, vilket innebรคr att Antalet testfall som behรถvs รคr lika med programmets cyklomatiska komplexitet.
Detta mรฅtt รคr anvรคndbart pรฅ grund av egenskaperna fรถr cyklomatisk komplexitet (M) -
- M kan vara antal testfall fรถr att uppnรฅ grentรคckning (รถvre grรคns)
- M kan vara antal vรคgar genom graferna. (nedre grรคns)
Tรคnk pรฅ det hรคr exemplet -
If (Condition 1) Statement 1 Else Statement 2 If (Condition 2) Statement 3 Else Statement 4
Cyklomatisk komplexitet fรถr detta program kommer att vara 8-7+2=3.
Eftersom komplexiteten har berรคknats som 3, รคr tre testfall nรถdvรคndiga fรถr att fullstรคndig vรคgtรคckning fรถr exemplet ovan.
Steg som ska fรถljas
Fรถljande steg bรถr fรถljas fรถr berรคkning av cyklomatisk komplexitet och design av testfall.
steg 1 โ Konstruktion av graf med noder och kanter frรฅn koden
steg 2 โ Identifiering av oberoende vรคgar
steg 3 โ Cyklomatisk komplexitetsberรคkning
steg 4 โ Design av testfall
Nรคr grunduppsรคttningen vรคl รคr bildad, TESTFALL bรถr skrivas fรถr att kรถra alla sรถkvรคgar.
Mer om V (G)
Cyklomatisk komplexitet kan berรคknas manuellt om programmet รคr litet. Automatiserade verktyg mรฅste anvรคndas om programmet รคr mycket komplext eftersom det innebรคr fler flรถdesdiagram. Baserat pรฅ komplexitetsnummer kan teamet dra slutsatser om de รฅtgรคrder som mรฅste vidtas fรถr รฅtgรคrd.
Fรถljande tabell ger en รถversikt รถver komplexitetstalet och motsvarande betydelse av v (G):
| Komplexitetsnummer | Betydelse |
|---|---|
| 1 till 10 |
Strukturerad och vรคlskriven kod Hรถg testbarhet Kostnad och anstrรคngning รคr mindre |
| 11 till 20 |
Komplex kod Medelhรถg testbarhet Kostnad och anstrรคngning รคr medelhรถg |
| 21 till 40 |
Mycket komplex kod Lรฅg testbarhet Kostnaden och anstrรคngningen รคr hรถg |
| > 40 |
Inte alls testbar Mycket hรถg kostnad och anstrรคngning |
Verktyg fรถr att berรคkna cyklomatisk komplexitet
Mรฅnga verktyg finns tillgรคngliga fรถr att bestรคmma applikationens komplexitet. Vissa verktyg fรถr komplexitetsberรคkning anvรคnds fรถr specifika tekniker. Komplexiteten kan hittas av antalet beslutspunkter i ett program. Beslutspunkterna รคr om, fรถr, fรถr varje, medan, gรถr, fรฅnga, falluttalanden i en kรคllkod.
Exempel pรฅ verktyg รคr
- OCLint โ Statisk kodanalysator fรถr C och relaterade sprรฅk
- SonarQube โ Rapporterar cyklomatisk och kognitiv komplexitet pรฅ fler รคn 25 sprรฅk
- Visual Studio Code Mรคtvรคrden โ Inbyggd cyklomatisk komplexitetsanalys fรถr .NET-assemblies
- Radon och Lizard โ Kommandoradsanalysatorer fรถr komplexitet Python respektive fรถr flersprรฅkiga projekt
- Gmetrik โ Hitta mรคtvรคrden i Java relaterade applikationer
Anvรคndningsomrรฅden fรถr cyklomatisk komplexitet
Cyklomatisk komplexitet kan visa sig vara till stor hjรคlp
- Hjรคlper utvecklare och testare att bestรคmma oberoende sรถkvรคgskรถrningar
- Utvecklare kan fรถrsรคkra sig om att alla sรถkvรคgar har testats minst en gรฅng
- Hjรคlper oss att fokusera mer pรฅ de oupptรคckta vรคgarna
- Fรถrbรคttra kodtรคckningen i Mjukvaruutveckling
- Utvรคrdera risken fรถrknippad med applikationen eller programmet
- Att anvรคnda dessa mรคtvรคrden tidigt i cykeln minskar risken fรถr programmet
Hur man minskar cyklomatisk komplexitet
Ett hรถgt komplexitetstal รคr en signal, inte en dom. Fyra omfaktoreringar stรฅr fรถr den stรถrsta delen av den reduktion som รคr mรถjlig i praktiken.
- Extract-metoden. Att flytta en gren till en egen funktion delar komplexiteten mellan tvรฅ moduler. Totalen i systemet รคr ofรถrรคndrad, men varje enhet blir oberoende testbar.
- Ersรคtt en villkorlig kedja med en sรถkning. En lรฅng if-else-if-stege som testar samma variabel blir en karta eller en switch, som kollapsar mรฅnga beslutspunkter till en.
- Anvรคnd skyddsklausuler. Att returnera tidigt vid ogiltig inmatning tar bort den kapsling som ett enda stort if-else-block skapar, utan att รคndra beteendet.
- Ersรคtt villkor med polymorfism. Om ett villkor aktiverar en typ, tar flyttningen av varje gren till en egen klass bort avgรถrandet helt.
Fรถre, med V(G) = 4:
if (user != null) { if (user.isActive()) { if (user.hasRole("admin")) { return grantAccess(); } } } return denyAccess();
Efter, med samma beteende och kapslingen borttagen:
if (user == null) return denyAccess(); if (!user.isActive()) return denyAccess(); if (!user.hasRole("admin")) return denyAccess(); return grantAccess();
En varning angรฅende mรคtvรคrdet. Cyklomatisk komplexitet rรคknas som beslut, inte svรฅrighetsgrad. En switch-sats med tjugo enkla fall ger 21 poรคng men รคr lรคtt att lรคsa, medan ett djupt kapslat block som ger 8 poรคng kan vara mycket svรฅrare att fรถrstรฅ. Anvรคnd siffran fรถr att hitta kandidater fรถr granskning, inte som ett mรฅl att bli lurad pรฅ.


.png)
.png)