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.

  • ๐Ÿ“ Tvรฅ formler: V(G) = E โ€“ N + 2 frรฅn grafen, eller V(G) = P + 1 frรฅn antalet beslutspunkter.
  • ๐Ÿงฎ Direkt betydelse: Vรคrdet รคr lika med det maximala antalet oberoende sรถkvรคgar, och dรคrmed antalet testfall som behรถvs.
  • ๐Ÿ—บ๏ธ Grafbas: Noder representerar bearbetningssteg och kanter representerar kontrollflรถdet mellan dem.
  • ๐ŸŸข 1 till 10: Strukturerad, vรคlskriven kod med hรถg testbarhet och lรฅg underhรฅllskostnad.
  • ๐ŸŸ  21 till 40: Mycket komplex kod med lรฅg testbarhet, dรคr refactoring vanligtvis kostar mindre รคn testning.
  • ๐Ÿ› ๏ธ Verktyg: SonarQube, Visual Studio Code Mรคtvรคrden, radon och รถdla berรคknar det automatiskt.

Cyklomatisk komplexitet i mjukvarutestning

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.

McCabes cyklomatiska komplexitet

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.

Flรถdesgrafnotation fรถr ett program

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 cyklomatisk komplexitet

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:

  1. V (G) รคr det maximala antalet oberoende vรคgar i grafen
  2. V (G) >=1
  3. G kommer att ha en vรคg om V (G) = 1
  4. 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) -

  1. M kan vara antal testfall fรถr att uppnรฅ grentรคckning (รถvre grรคns)
  2. 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รฅ.

Vanliga frรฅgor

Tio eller fรคrre per modul รคr den vanliga riktlinjen. Mellan 11 och 20 รคr koden komplex men hanterbar. ร–ver 20 minskar testbarheten kraftigt, och รถver 40 anses modulen generellt vara otestbar som den รคr skriven.

Bรฅda ger samma resultat. P + 1 รคr snabbare fรถr manuell berรคkning eftersom man bara rรคknar beslutspunkter. E โ€“ N + 2 รคr vad verktyg anvรคnder, eftersom de redan bygger kontrollflรถdesgrafen.

Inte nรถdvรคndigtvis. Cyklomatisk komplexitet rรคknas snarare รคn svรฅrighetsgrad, sรฅ en platt vรคxel med tjugo enkla fall fรฅr hรถga poรคng samtidigt som den รคr lรคttlรคst. Behandla numret som en uppmaning till repetition.

De kombinerar det med รคndringsfrekvens och felhistorik fรถr att rangordna vilka moduler som bรคr stรถrst risk, och riktar granskning och testarbete mot den kod som mest sannolikt kommer att misslyckas.

Ja. AI-assistenter fรถreslรฅr vaktklausuler, t.ex.tracted-metoder och uppslagstabeller som minskar antalet. Verifiera beteendet med den befintliga testsviten, eftersom en omstrukturering som รคndrar logiken motverkar syftet.

Sammanfatta detta inlรคgg med: