Close

Co to jest pokrycie kodu?

Z tego artykułu dowiesz się, czym jest pokrycie kodu i jak znaleźć odpowiednie narzędzie do jego obliczania. 

Portret Stena Pitteta
Sten Pittet

Autor współpracujący


Pokrycie kodu to wskaźnik, który pomaga zrozumieć, jaka część źródła jest testowana. Wskaźnik ten jest bardzo przydatny, ponieważ może pomóc w ocenie jakości zestawu testów. Zastanówmy się, jak można go wykorzystać w projektach.

Sposób obliczania pokrycia kodu


Narzędzia do obliczania pokrycia kodu używają jednego lub wielu kryteriów, aby określić, czy i w jaki sposób kod został wykonany podczas przeprowadzania zestawu testów. Wskaźniki, które możesz spotkać w swoich raportach pokrycia, to między innymi:

  • Pokrycie funkcji: ile zdefiniowanych funkcji zostało wywołanych.
  • Pokrycie instrukcji: ile instrukcji zawartych w programie zostało wykonanych.
  • Pokrycie gałęzi: ile gałęzi struktur sterujących (na przykład instrukcji if) zostało wykonanych.
  • Pokrycie warunków: ile podwyrażeń logicznych zostało przetestowanych pod kątem wartości true i false.
  • Pokrycie wierszy: ile wierszy kodu źródłowego zostało przetestowanych.

Wskaźniki te są zwykle przedstawiane jako liczba elementów faktycznie przetestowanych, liczba elementów znalezionych w kodzie i procent pokrycia (elementy przetestowane / elementy znalezione).

Powyższe wskaźniki są powiązane, ale odrębne. W poniższym trywialnym skrypcie mamy funkcję JavaScript sprawdzającą, czy argument jest wielokrotnością liczby 10. Funkcji tej użyjemy później do sprawdzenia, czy liczba 100 jest wielokrotnością liczby 10. Pomoże nam to zrozumieć różnicę między pokryciem funkcji a pokryciem gałęzi.

Poznaj rozwiązanie

Tworzenie i obsługa oprogramowania za pomocą Open DevOps

Materiały pokrewne

Zautomatyzowane testowanie na potrzeby DevOps

coverage-tutorial.js

function isMultipleOf10(x) {   if (x % 10 == 0)     return true;   else    return false; }   console.log(isMultipleOf10(100));


Możemy użyć narzędzia do obliczania pokrycia istanbul, aby sprawdzić, jaka część naszego kodu jest wykonywana, gdy uruchamiamy ten skrypt. Po uruchomieniu tego narzędzia otrzymujemy raport pokrycia zawierający nasze wskaźniki. Widzimy, że pokrycie funkcji wynosi 100%, natomiast pokrycie gałęzi tylko 50%. Widzimy również, że narzędzie istanbul nie oblicza wskaźnika pokrycia kodu.

Uzyskiwanie raportu pokrycia w wierszu poleceń

Wynika to z faktu, że w momencie uruchomienia naszego skryptu instrukcja else nie została wykonana. Gdybyśmy chcieli uzyskać 100% pokrycia, moglibyśmy po prostu dodać kolejny wiersz — w zasadzie kolejny test — aby upewnić się, że wszystkie gałęzie instrukcji if są używane.

coverage-tutorial.js

function isMultipleOf10(x) {   if (x % 10 == 0)     return true;   else     return false; }   console.log(isMultipleOf10(100)); console.log(isMultipleOf10(34)); // This will make our code execute the "return false;" statement.  


Przy drugim uruchomieniu narzędzia do obliczania pokrycia okaże się, że pokryte jest 100% źródła dzięki dwóm znajdującym się na dole instrukcjom console.log().

Uzyskanie 100% pokrycia we wszystkich kryteriach

W tym przykładzie jedynie rejestrowaliśmy wyniki w terminalu, ale ta sama zasada obowiązuje podczas uruchamiania zestawu testów. Narzędzie do obliczania pokrycia kodu będzie monitorować wykonanie zestawu testów i poinformuje Cię, ile instrukcji, gałęzi, funkcji i wierszy zostało uruchomionych w ramach testów.

Narzędzie istanbul dla JavaScript może przedstawić szczegółowy raport dotyczący pokrycia każdej ścieżki

Pokrycie kodu: 6 wskazówek na początek


1. Znajdź odpowiednie narzędzie do swojego projektu

Możesz znaleźć kilka opcji tworzenia raportów pokrycia w zależności od używanych języków. Poniżej przedstawiamy niektóre z popularnych narzędzi:

Porównanie narzędzi może również pomóc w podjęciu decyzji. Niektóre narzędzia, takie jak np. istanbul, wysyłają wyniki bezpośrednio do terminala, podczas gdy inne mogą wygenerować pełny raport HTML, który pozwala zbadać, w których częściach kodu brakuje pokrycia.

2. Do jakiego procentu pokrycia należy dążyć?

Nie ma uniwersalnego podejścia do kwestii pokrycia kodem. Nawet w sytuacji, gdy jest ono wysokie, mogą pojawić się problemy, jeśli krytyczne części aplikacji nie są testowane lub jeśli istniejące testy nie są wystarczająco solidne, aby odpowiednio wychwycić błędy z wyprzedzeniem. Niemniej jednak ogólnie przyjmuje się, że 80% pokrycia jest dobrym celem. Próba osiągnięcia wyższego pokrycia może okazać się kosztowna, a jednocześnie nie musi przynieść wystarczających korzyści.

Przy pierwszym uruchomieniu narzędzia do obliczania pokrycia może się okazać, że procent pokrycia jest dość niski. Jeśli dopiero zaczynasz testowanie, jest to normalna sytuacja. Nie należy narzucać sobie presji uzyskania 80% pokrycia na samym początku. Powodem jest to, że pośpiech w dążeniu do celu w zakresie pokrycia może spowodować, że zespół będzie pisał testy z myślą o poprawie tego wskaźnika, a nie o wymaganiach biznesowych związanych z aplikacją.

Na przykład w powyższym przykładzie osiągnęliśmy 100% pokrycia, testując, czy liczby 100 i 34 są wielokrotnością liczby 10. A jeśli zamiast liczby wywołalibyśmy naszą funkcję za pomocą litery? Czy uzyskalibyśmy wówczas wynik true/false? A może wyjątek? Ważne jest, aby dać swojemu zespołowi czas na przeanalizowanie procesu testowania z perspektywy użytkownika, a nie tylko poprzez przeglądanie wierszy kodu. Na podstawie pokrycia kodu nie dowiesz się, czy w źródle czegoś brakuje.

3. Skup się w pierwszej kolejności na testach jednostkowych

Testy jednostkowe polegają na upewnieniu się, że poszczególne metody klas i komponentów używanych przez aplikację działają. Są one na ogół tanie do wdrożenia i można je szybko uruchomić. Co więcej, dają ogólną pewność, że podstawa platformy jest solidna. Prostym sposobem na szybkie zwiększenie pokrycia kodu jest rozpoczęcie od dodania testów jednostkowych, ponieważ z definicji powinny one pomóc w upewnieniu się, że zestaw testów dociera do wszystkich wierszy kodu.

4. Korzystaj z raportów pokrycia w celu identyfikacji najważniejszych braków w testach

Wkrótce w Twoim kodzie pojawi się tak wiele testów, że nie będziesz wiedzieć, jaka część aplikacji jest sprawdzana podczas wykonywania zestawu testów. Dowiesz się, co uległo awarii, gdy otrzymasz czerwoną kompilację, ale trudno będzie Ci zrozumieć, jakie komponenty przeszły testy.

Właśnie w tym momencie raporty pokrycia mogą dostarczyć Twojemu zespołowi użytecznych wskazówek. Większość narzędzi pozwoli Ci zagłębić się w raporty pokrycia i wskazać konkretne elementy, które nie zostały objęte testami, a następnie wykorzystać te informacje do zidentyfikowania krytycznych części aplikacji, które nadal wymagają przetestowania.

SimpleCov dla Ruby może pokazać, które metody nie zostały przetestowane

5. Odpowiednio przygotuj się do włączenia pokrycia kodu do swojego przepływu ciągłej integracji

Po ustanowieniu przepływu pracy ciągłej integracji (CI) testy mogą kończyć się niepowodzeniem, jeśli nie osiągniesz wystarczająco wysokiego procentu pokrycia. Oczywiście, jak wspomnieliśmy wcześniej, nierozsądnie byłoby ustawić zbyt wysoki próg niepowodzenia; jeśli np. wynosiłby on 90% pokrycia, to kompilacja nie zaliczy wielu testów. Jeśli Twoim celem jest 80% pokrycia, możesz rozważyć ustawienie progu niepowodzenia na poziomie 70% — będzie to zabezpieczenie dla Twojej kultury CI.

Pamiętaj, że należy unikać wysyłania niewłaściwych komunikatów, ponieważ wywieranie na zespół presji uzyskania dobrego pokrycia może prowadzić do złych praktyk testowania.

6. Dobre pokrycie nie jest równoznaczne z dobrymi testami

Aby wypracować świetną kulturę testowania, zespół musi zrozumieć, jak aplikacja ma działać, gdy ktoś używa jej prawidłowo, ale także wtedy, gdy ktoś próbuje ją zepsuć. Narzędzia do obliczania pokrycia kodu mogą pomóc Ci zrozumieć, na czym należy skupić uwagę, ale nie stwierdzą, czy istniejące testy są wystarczająco odporne na nieoczekiwane zachowania.

Osiągnięcie dużego pokrycia to doskonały cel, ale nie należy przy tym zapominać o solidnym zestawie testów, który może zapewnić, że poszczególne klasy nie są uszkodzone, a także zweryfikować integralność systemu.

Tutaj dowiesz się więcej o różnych rodzajach testowania oprogramowania. Open DevOps firmy Atlassian zapewnia dostęp do otwartej platformy łańcucha narzędzi umożliwiającej tworzenie pipeline'u programistycznego opartego na CD z wykorzystaniem ulubionych narzędzi. Dowiedz się, jak wykorzystać narzędzia firmy Atlassian i innych firm, aby włączyć testowanie do przepływu pracy, sięgając do naszych samouczków dotyczących testowania DevOps.

Sten Pittet
Sten Pittet

Od 10 lat pracuję w branży oprogramowania na różnych stanowiskach — od tworzenia rozwiązań po zarządzanie produktem. Przez ostatnie 5 lat opracowywałem w Atlassian narzędzia dla programistów, a obecnie piszę o tworzeniu oprogramowania. Poza pracą doskonalę swoje umiejętności ojcowskie, opiekując się wspaniałym maluchem.


Udostępnij ten artykuł

Zalecane lektury

Dodaj te zasoby do zakładek, aby dowiedzieć się więcej na temat rodzajów zespołów DevOps lub otrzymywać aktualności na temat metodyki DevOps w Atlassian.

Ilustracja DevOps

Społeczność DevOps

Ilustracja DevOps

Przeczytaj blog

Ilustracja przedstawiająca mapę

Zacznij korzystać za darmo

Zapisz się do newslettera DevOps

Thank you for signing up