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.

  • 📐 Dwie formuły: V(G) = E – N + 2 z wykresu lub V(G) = P + 1 z liczby punktów decyzyjnych.
  • 🧮 Znaczenie bezpośrednie: Wartość ta jest równa maksymalnej liczbie niezależnych ścieżek, a co za tym idzie, liczbie potrzebnych przypadków testowych.
  • 🗺️. Podstawa grafu: Węzły reprezentują kroki przetwarzania, a krawędzie reprezentują przepływ sterowania między nimi.
  • 🟢 1 do 10: Ustrukturyzowany, dobrze napisany kod, łatwy w testowaniu i o niskich kosztach utrzymania.
  • 🟠 21 do 40: Bardzo skomplikowany kod o niskiej testowalności, w przypadku którego refaktoryzacja zazwyczaj kosztuje mniej niż testowanie.
  • 🛠️. Obróbka: SonarQube, Visual Studio Code Metrics, Radon i Lizard obliczają to automatycznie.

Złożoność cyklomatyczna w testowaniu oprogramowania

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.

Złożoność cyklomatyczna McCabe'a

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.

Notacja wykresu przepływu programu

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

Oblicz złożoność cyklomatyczną

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:

  1. V (G) to maksymalna liczba niezależnych ścieżek w grafie
  2. V (G) >=1
  3. G będzie miał jedną ścieżkę, jeśli V (G) = 1
  4. 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) –

  1. M może być liczbą przypadków testowych wymaganą do osiągnięcia pokrycia gałęzi (górna granica)
  2. 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.

FAQ

Dziesięć lub mniej na moduł to standardowa wytyczna. Pomiędzy 11 a 20 kod jest złożony, ale łatwy w zarządzaniu. Powyżej 20 testowalność gwałtownie spada, a powyżej 40 moduł jest generalnie uznawany za nietestowalny w swojej pierwotnej formie.

Oba dają ten sam wynik. P + 1 jest szybsze w obliczeniach ręcznych, ponieważ liczy się tylko punkty decyzyjne. Narzędzia używają E – N + 2, ponieważ już budują graf przepływu sterowania.

Niekoniecznie. Złożoność cyklomatyczna liczy decyzje, a nie trudność, więc płaski przełącznik z dwudziestoma prostymi przypadkami jest wysoko oceniany, pozostając jednocześnie łatwym do odczytania. Potraktuj tę liczbę jako zachętę do ponownego przejrzenia.

Łączą to z częstotliwością zmian i historią błędów, aby określić, które moduły niosą ze sobą największe ryzyko, kierując wysiłki związane z przeglądem i testowaniem na kod, który najprawdopodobniej ulegnie awarii.

Tak. Asystenci AI proponują klauzule ochronne, np.tracMetody Ted i tabele wyszukiwania, które redukują liczbę. Zweryfikuj działanie z istniejącym zestawem testów, ponieważ refaktoryzacja zmieniająca logikę niweczy cel.

Podsumuj ten post następująco: