Złożoność cyklomatyczna w testowaniu oprogramowania z przykładem
⚡ Inteligentne podsumowanie
Złożoność cyklomatyczna to metryka oprogramowania opracowana przez Thomasa McCabe'a w 1976 roku, która zlicza niezależne ścieżki w programie. Jest obliczana na podstawie grafu przepływu sterowania i określa liczbę przypadków testowych wymaganych do pełnego pokrycia gałęzi.

Czym jest złożoność cyklomatyczna McCabe'a?
Złożoność cyklomatyczna w testowaniu oprogramowania jest metryką testową używaną do pomiaru złożoności programu komputerowego. Jest ilościową miarą niezależnych ścieżek w kodzie źródłowym programu komputerowego. Złożoność cyklomatyczną można obliczyć, używając wykresów przepływu sterowania lub w odniesieniu do funkcji, modułów, metod lub klas w programie komputerowym.
Ścieżkę niezależną definiuje się jako ścieżkę, która ma co najmniej jedną krawędź, która nie została wcześniej przebyta żadną inną ścieżką.
Metryka ta została opracowana przez Thomasa J. McCabe w 1976 roku i opiera się na reprezentacji przepływu sterowania programu. Przepływ sterowania przedstawia program w postaci wykresu składającego się z węzłów i krawędzi.
Na wykresie węzły reprezentują zadania przetwarzania, a krawędzie reprezentują przepływ sterowania między węzłami.
Notacja wykresu przepływu dla programu
Notacja Flow Graph dla programu definiuje kilka węzłów połączonych krawędziami. Poniżej znajdują się diagramy przepływu dla instrukcji takich jak if-else, While, dopóki i normalna sekwencja przepływu.
Jak obliczyć złożoność cyklomatyczną
Reprezentacja matematyczna:
Matematycznie jest to zbiór niezależnych ścieżek przechodzących przez diagram grafu. Code złożoność programu można określić za pomocą wzoru –
V(G) = E - N + 2
Gdzie,
E – Liczba krawędzi
N – Liczba węzłów
V (G) = P + 1
Gdzie P = liczba węzłów predykatów (węzeł zawierający warunek)
Przykład -
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;
Wykres przepływu dla tego programu będzie
Obliczanie matematyczne,
- V(G) = 9 – 7 + 2 = 4
- V(G) = 3 + 1 = 4 (węzły warunku to 1,2 i 3 węzły)
Zestaw podstawowy, cztery niezależne ścieżki wykonania:
- 1, 7
- 1, 2, 6, 1, 7
- 1, 2, 3, 4, 5, 2, 6, 1, 7
- 1, 2, 3, 5, 2, 6, 1, 7
Właściwości złożoności cyklomatycznej
Poniżej przedstawiono właściwości złożoności cyklomatycznej:
- V (G) to maksymalna liczba niezależnych ścieżek w grafie
- V (G) >=1
- G będzie miał jedną ścieżkę, jeśli V (G) = 1
- Powszechnie stosowaną wytyczną jest utrzymanie V(G) na poziomie 10 lub niższym dla pojedynczego modułu
Jak ta metryka jest przydatna w testowaniu oprogramowania
Testowanie ścieżki bazowej to jedna z technik „białej skrzynki” i gwarantuje wykonanie co najmniej jednego polecenia podczas testowania. Sprawdza każdą liniowo niezależną ścieżkę w programie, co oznacza, że… liczba potrzebnych przypadków testowych jest równa złożoności cyklomatycznej programu.
Ta metryka jest użyteczna ze względu na właściwości złożoności cyklomatycznej (M) –
- M może być liczbą przypadków testowych wymaganą do osiągnięcia pokrycia gałęzi (górna granica)
- M może być liczbą ścieżek przechodzących przez grafy. (Dolna granica)
Rozważmy ten przykład –
If (Condition 1) Statement 1 Else Statement 2 If (Condition 2) Statement 3 Else Statement 4
Złożoność cyklomatyczna tego programu będzie wynosić 8-7+2=3.
Ponieważ obliczona złożoność wynosi 3, do pełnego pokrycia ścieżki w powyższym przykładzie konieczne są trzy przypadki testowe.
Kroki, które należy wykonać
Aby obliczyć złożoność cyklomatyczną i zaprojektować przypadki testowe, należy wykonać następujące kroki.
Krok 1 – Budowa grafu z węzłami i krawędziami z kodu
Krok 2 – Identyfikacja niezależnych ścieżek
Krok 3 – Obliczanie złożoności cyklomatycznej
Krok 4 – Projektowanie przypadków testowych
Po utworzeniu podstawowego zestawu PRZYPADKI TESTOWE należy zapisać, aby wykonać wszystkie ścieżki.
Więcej o V (G)
Złożoność cyklomatyczną można obliczyć ręcznie, jeśli program jest mały. Jeśli program jest bardzo złożony, należy użyć zautomatyzowanych narzędzi, ponieważ wymaga to większej liczby wykresów przepływu. Na podstawie liczby złożoności zespół może wnioskować o działaniach, które należy podjąć w celu pomiaru.
Poniższa tabela przedstawia przegląd liczb złożoności i odpowiadającego im znaczenia v (G):
| Liczba złożoności | Znaczenie |
|---|---|
| 1 do 10 |
Ustrukturyzowany i dobrze napisany kod Wysoka testowalność Koszt i wysiłek są mniejsze |
| 11 do 20 |
Złożony kod Średnia testowalność Koszt i wysiłek są średnie |
| 21 do 40 |
Bardzo złożony kod Niska testowalność Koszt i wysiłek są wysokie |
| > 40 |
Wcale nie do przetestowania Bardzo wysoki koszt i wysiłek |
Narzędzia do obliczania złożoności cyklomatycznej
Dostępnych jest wiele narzędzi do określania złożoności aplikacji. Niektóre narzędzia do obliczania złożoności są używane w przypadku określonych technologii. Złożoność można znaleźć na podstawie liczby punktów decyzyjnych w programie. Punktami decyzyjnymi są instrukcje if, for, for-each, while, do, catch, case w kodzie źródłowym.
Przykładami narzędzi są
- OCLint – Statyczny analizator kodu dla języków C i pokrewnych
- SonarQube – Raportuje złożoność cyklomatyczną i poznawczą w ponad 25 językach
- Visual Studio Code Metryki – wbudowana analiza złożoności cyklomatycznej dla zestawów .NET
- Radon i Lizard – analizatory złożoności wiersza poleceń dla Python i odpowiednio dla projektów wielojęzycznych
- GMetrics – Znajdź metryki w Java powiązane aplikacje
Zastosowania złożoności cyklomatycznej
Złożoność cyklomatyczna może okazać się bardzo pomocna w
- Pomaga programistom i testerom w określeniu niezależnych wykonań ścieżek
- Twórcy mogą mieć pewność, że wszystkie ścieżki zostały przetestowane co najmniej raz
- Pomaga nam bardziej skupić się na odkrytych ścieżkach
- Popraw pokrycie kodu w Inżynieria oprogramowania
- Oceń ryzyko związane z aplikacją lub programem
- Korzystanie z tych wskaźników na początku cyklu zmniejsza większe ryzyko programu
Jak zredukować złożoność cyklomatyczną
Wysoka wartość złożoności to sygnał, a nie werdykt. Cztery refaktoryzacje odpowiadają za większość redukcji możliwych do osiągnięcia w praktyce.
- Extracmetoda t. Przeniesienie gałęzi do jej własnej funkcji dzieli złożoność między dwa moduły. Suma w całym systemie pozostaje niezmieniona, ale każda jednostka staje się niezależnie testowalna.
- Zastąp łańcuch warunkowy wyszukiwaniem. Długa drabinka if-else-if testująca tę samą zmienną staje się mapą lub przełącznikiem, który scala wiele punktów decyzyjnych w jeden.
- Stosuj klauzule ochronne. Wczesne zwrócenie nieprawidłowego wejścia usuwa zagnieżdżenie, które powstaje w wyniku użycia jednego dużego bloku if-else, bez zmiany zachowania.
- Zastąp warunki polimorfizmem. Gdy warunek przełącza na typ, przeniesienie każdej gałęzi do jej własnej klasy całkowicie anuluje decyzję.
Wcześniej, przy V(G) = 4:
if (user != null) { if (user.isActive()) { if (user.hasRole("admin")) { return grantAccess(); } } } return denyAccess();
Następnie, przy takim samym zachowaniu i usuniętym zagnieżdżeniu:
if (user == null) return denyAccess(); if (!user.isActive()) return denyAccess(); if (!user.hasRole("admin")) return denyAccess(); return grantAccess();
Ostrzeżenie dotyczące metryki. Złożoność cyklomatyczna liczy decyzje, a nie trudność. Instrukcja switch z dwudziestoma prostymi przypadkami ma wynik 21, a mimo to jest łatwa do odczytania, podczas gdy głęboko zagnieżdżony blok ma wynik 8, może być znacznie trudniejszy do zrozumienia. Wykorzystaj tę liczbę, aby znaleźć kandydatów do przeglądu, a nie jako cel do oszukania.


.png)
.png)