Complexitate ciclomatică în testarea software cu exemplu

⚡ Rezumat inteligent

Complexitatea ciclomatică este o metrică software dezvoltată de Thomas McCabe în 1976 care numără căile independente printr-un program. Se calculează dintr-un grafic al fluxului de control și oferă numărul de cazuri de testare necesare pentru acoperirea completă a ramurii.

  • 📐 Două formule: V(G) = E – N + 2 din grafic sau V(G) = P + 1 din numărul de puncte de decizie.
  • 🧮 Semnificație directă: Valoarea este egală cu numărul maxim de căi independente și, prin urmare, cu cazurile de testare necesare.
  • 🗺️ Baza graficului: Nodurile reprezintă pașii de procesare, iar muchiile reprezintă fluxul de control dintre ele.
  • 🟢 1 la 10: Cod structurat, bine scris, cu testabilitate ridicată și costuri de întreținere reduse.
  • 🟠 21 la 40: Cod foarte complex cu testabilitate scăzută, unde refactorizarea costă de obicei mai puțin decât testarea.
  • 🛠️ scule: SonarQube, Visual Studio Code Metrics, Radon și Lizard îl calculează automat.

Complexitatea ciclomatică în testarea software-ului

Ce este complexitatea ciclomatică a lui McCabe?

Complexitatea ciclomatică în testarea software-ului este o metrică de testare utilizată pentru măsurarea complexității unui program software. Este o măsură cantitativă a căilor independente în codul sursă al unui program software. Complexitatea ciclomatică poate fi calculată utilizând grafice de flux de control sau cu privire la funcții, module, metode sau clase dintr-un program software.

Calea independentă este definită ca o cale care are cel puțin o margine care nu a fost parcursă înainte în alte căi.

Această măsurătoare a fost dezvoltată de Thomas J. McCabe în 1976 și se bazează pe o reprezentare a fluxului de control a programului. Fluxul de control descrie un program ca un grafic care constă din Noduri și Muchii.

În grafic, nodurile reprezintă sarcini de procesare, în timp ce marginile reprezintă fluxul de control între noduri.

Complexitatea ciclomatică a lui McCabe

Notația graficului de flux pentru un program

Notația Flow Graph pentru un program definește mai multe noduri conectate prin margini. Mai jos sunt diagrame de flux pentru instrucțiuni precum if-else, While, until și secvența normală a fluxului.

Notarea graficului de flux pentru un program

Cum se calculează complexitatea ciclomatică

Reprezentare matematică:

Matematic, este un set de căi independente prin diagrama grafică. Code Complexitatea programului poate fi definită folosind formula –

V(G) = E - N + 2

Unde,

E – Numărul de muchii

N – Numărul de noduri

V (G) = P + 1

Unde P = Numărul de noduri predicate (nodul care conține condiția)

Exemplu -

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;

Graficul de flux pentru acest program va fi

Calculați complexitatea ciclomatică

Calculul matematic,

  • V(G) = 9 – 7 + 2 = 4
  • V(G) = 3 + 1 = 4 (Condiția nodurilor sunt 1,2 și 3 noduri)

Set de bază, cele patru căi de execuție independente:

  • 1, 7
  • 1, 2, 6, 1, 7
  • 1, 2, 3, 4, 5, 2, 6, 1, 7
  • 1, 2, 3, 5, 2, 6, 1, 7

Proprietățile complexității ciclomatice

Următoarele sunt proprietățile complexității ciclomatice:

  1. V (G) este numărul maxim de căi independente din grafic
  2. V (G) >=1
  3. G va avea o cale dacă V (G) = 1
  4. O regulă generală utilizată este menținerea V(G) la 10 sau mai puțin pentru un singur modul.

Cum este utilă această metrică pentru testarea software-ului

Testarea Basic Path este una dintre tehnicile White Box și garantează executarea a cel puțin unei instrucțiuni în timpul testării. Verifică fiecare cale liniar independentă prin program, ceea ce înseamnă numărul de cazuri de testare necesare este egal cu complexitatea ciclomatică a programului.

Această măsurătoare este utilă datorită proprietăților complexității ciclomatice (M) -

  1. M poate fi numărul de cazuri de testare pentru a obține acoperirea sucursalei (limită superioară)
  2. M poate fi numărul de căi prin grafice. (Limita inferioară)

Luați în considerare acest exemplu -

If (Condition 1)
Statement 1

Else
Statement 2

If (Condition 2)
Statement 3

Else
Statement 4

Complexitatea ciclomatică pentru acest program va fi 8-7+2=3.

Deoarece complexitatea a calculat ca 3, sunt necesare trei cazuri de testare pentru acoperirea completă a căii pentru exemplul de mai sus.

Pași de urmat

Următorii pași ar trebui urmați pentru calcularea complexității ciclomatice și proiectarea cazurilor de testare.

Etapa 1 – Construcția graficului cu noduri și muchii din cod

Etapa 2 – Identificarea traseelor ​​independente

Etapa 3 – Calculul complexității ciclomatice

Etapa 4 – Proiectarea cazurilor de testare

Odată ce setul de bază este format, CAZURI DE TESTARE ar trebui să fie scris pentru a executa toate căile.

Mai multe despre V (G)

Complexitatea ciclomatică poate fi calculată manual dacă programul este mic. Instrumentele automate trebuie utilizate dacă programul este foarte complex, deoarece acesta implică mai multe grafice de flux. Pe baza numărului de complexitate, echipa poate concluziona asupra acțiunilor care trebuie luate pentru măsură.

Următorul tabel oferă o prezentare generală a numărului de complexitate și a semnificației corespunzătoare a lui v (G):

Număr de complexitate Sens
1 la 10

Cod structurat și bine scris

Testabilitate ridicată

Costul și efortul sunt mai mici

11 la 20

Cod complex

Testabilitate medie

Costul și efortul sunt medii

21 la 40

Cod foarte complex

Testabilitate scăzută

Costul și efortul sunt mari

> 40

Deloc testabil

Costuri și efort foarte mari

Instrumente pentru calcularea complexității ciclomatice

Sunt disponibile multe instrumente pentru a determina complexitatea aplicației. Unele instrumente de calcul al complexității sunt utilizate pentru anumite tehnologii. Complexitatea poate fi găsită după numărul de puncte de decizie dintr-un program. Punctele de decizie sunt declarațiile if, for, for-each, while, do, catch, case într-un cod sursă.

Exemple de instrumente sunt

  • OCLint – Analizor de cod static pentru C și limbi înrudite
  • SonarQube – Raportează complexitatea ciclomatică și cognitivă în peste 25 de limbi
  • Visual Studio Code Metrici – Analiză ciclomatică a complexității încorporată pentru ansambluri .NET
  • Radon și Lizard – Analizoare de complexitate în linie de comandă pentru Python și respectiv pentru proiecte multilingve
  • GMetrics – Găsiți valori în Java aplicații aferente

Utilizări ale complexității ciclomatice

Complexitatea ciclomatică se poate dovedi a fi de mare ajutor

  • Ajută dezvoltatorii și testerii să determine execuții independente ale căilor
  • Dezvoltatorii pot asigura că toate căile au fost testate cel puțin o dată
  • Ne ajută să ne concentrăm mai mult pe căile descoperite
  • Îmbunătățiți acoperirea codului în Inginerie Software
  • Evaluați riscul asociat aplicației sau programului
  • Utilizarea acestor valori la începutul ciclului reduce mai mult riscul programului

Cum să reduci complexitatea ciclomatică

Un număr de complexitate ridicată este un semnal, nu un verdict. Patru refactorizări explică cea mai mare parte a reducerii realizabile în practică.

  • Extracmetoda t. Mutarea unei ramuri într-o funcție proprie împarte complexitatea între două module. Totalul în sistem rămâne neschimbat, dar fiecare unitate devine testabilă independent.
  • Înlocuiți un lanț condițional cu o căutare. O scară lungă de tip if-else-if care testează aceeași variabilă devine o hartă sau un comutator, care restrânge mai multe puncte de decizie într-unul singur.
  • Folosește clauze de gardă. Returnarea anticipată a unei intrări nevalide elimină imbricarea creată de un singur bloc mare de tip if-else, fără a schimba comportamentul.
  • Înlocuiți condiționalele cu polimorfism. În cazul în care o condițională activează un tip, mutarea fiecărei ramuri în propria clasă elimină complet decizia.

Înainte, cu V(G) = 4:

if (user != null) {
    if (user.isActive()) {
        if (user.hasRole("admin")) {
            return grantAccess();
        }
    }
}
return denyAccess();

După aceea, cu același comportament și cu imbricarea eliminată:

if (user == null) return denyAccess();
if (!user.isActive()) return denyAccess();
if (!user.hasRole("admin")) return denyAccess();
return grantAccess();

O avertizare cu privire la metrică. Complexitatea ciclomatică contează deciziile, nu dificultatea. O instrucțiune switch cu douăzeci de cazuri simple are un scor de 21, dar este ușor de citit, în timp ce un bloc imbricat profund care are un scor de 8 poate fi mult mai greu de înțeles. Folosește numărul pentru a găsi candidați pentru revizuire, nu ca o țintă de manipulat.

Întrebări frecvente

Zece sau mai puțin per modul este orientarea obișnuită. Între 11 și 20, codul este complex, dar ușor de gestionat. Peste 20, testabilitatea scade brusc, iar peste 40, modulul este în general considerat netestabil așa cum este scris.

Ambele dau același rezultat. P + 1 este mai rapid pentru calculul manual, deoarece se numără doar punctele de decizie. E – N + 2 este ceea ce folosesc instrumentele, deoarece acestea construiesc deja graficul fluxului de control.

Nu neapărat. Complexitatea ciclomatică contează deciziile mai degrabă decât dificultatea, așa că o schimbare plată cu douăzeci de cazuri simple are un scor mare, rămânând în același timp ușor de citit. Tratați numărul ca pe o îndemnare pentru recapitulare.

Acestea combină acest lucru cu frecvența modificărilor și istoricul defectelor pentru a clasifica modulele care prezintă cel mai mare risc, direcționând eforturile de revizuire și testare către codul cel mai probabil să eșueze.

Da. Asistenții AI propun clauze de pază, de exemplutracmetode ted și tabele de căutare care reduc numărul. Verificați comportamentul cu suita de teste existentă, deoarece o refactorizare care modifică logica anulează scopul.

Rezumați această postare cu: