Jak czytać raport dotyczący stanu w Stambule?

131

Zawsze używałem Jasmine do moich testów jednostkowych, ale ostatnio zacząłem używać Stambułu do generowania raportów pokrycia kodu. Chodzi mi o to, że rozumiem sedno tego, co próbują mi powiedzieć, ale tak naprawdę nie wiem, co reprezentuje każdy z tych wartości procentowych (Stmts, Branches, Funcs, Lines). Jak dotąd Googling nie mogłem znaleźć solidnego wyjaśnienia / źródła.

Pytanie : Tak jak powiedziałem, rozumiem sedno, ale czy ktoś może zamieścić odpowiednie wyjaśnienie lub link do właściwego wyjaśnienia?

Trzeciorzędne pytanie : czy istnieje sposób, aby określić, które konkretne części kodu nie są objęte? Jak dotąd bez naprawdę narzekania na ten raport, w zasadzie zgaduję.

-------------------|-----------|-----------|-----------|-----------|
File               |   % Stmts |% Branches |   % Funcs |   % Lines |
-------------------|-----------|-----------|-----------|-----------|
   controllers/    |      88.1 |     77.78 |     78.57 |      88.1 |
      dashboard.js |      88.1 |     77.78 |     78.57 |      88.1 |
-------------------|-----------|-----------|-----------|-----------|
All files          |      88.1 |     77.78 |     78.57 |      88.1 |
-------------------|-----------|-----------|-----------|-----------|
Scott Sword
źródło
3
Uruchomiony Stambuł powinien również wygenerować plik HTML raportu (powinien znajdować się w folderze pokrycia). Ten kod HTML powinien zapewnić szczegółowe informacje po kliknięciu plików / folderów
Yaron Schwimmer
Dzięki @yarons. To zdecydowanie pomaga zagłębić się w zakres i określić, co konkretnie nie jest objęte. Nadal nie bardzo rozumiem na głębokości co procenty oznaczają = /.
Scott Sword

Odpowiedzi:

217

Istnieje kilka kryteriów pokrycia, z których najważniejsze to:

  • Pokrycie funkcji Czy została wywołana każda funkcja (lub podprogram) w programie?
  • Pokrycie instrukcji Czy każda instrukcja w programie została wykonana?
  • Pokrycie gałęzi Czy każda gałąź (nazywana również ścieżką DD) każdej struktury kontrolnej (na przykład instrukcje if i case) została wykonana? Na przykład, jeśli podano instrukcję if, czy została wykonana zarówno gałąź true, jak i false? Inaczej mówiąc, czy każda krawędź w programie została wykonana?
  • Pokrycie linii czy każda linia wykonywalna w pliku źródłowym została wykonana?

W każdym przypadku procent reprezentuje wykonany kod w porównaniu z kodem niewykonanym , co jest równe każdej części w formacie procentowym (np .: 50% oddziałów, 1/2).

W raporcie z pliku:

  • 'E' oznacza „inną ścieżkę niepobraną”, co oznacza, że ​​w przypadku zaznaczonej instrukcji if / else przetestowano ścieżkę „if”, ale nie ścieżkę „else”.
  • 'I' oznacza „jeśli ścieżka nie została zajęta”, co jest odwrotnym przypadkiem: „jeśli” nie zostało przetestowane.
  • W xNlewej kolumnie jest liczba wykonanych linii.
  • Niewykonane wiersze lub fragmenty kodu zostaną podświetlone na czerwono.

Zostało to zweryfikowane dla Istambułu v0.4.0, nie jestem pewien, czy to nadal dotyczy kolejnych wersji, ale ponieważ ta biblioteka jest oparta na solidnych zasadach teoretycznych, zachowanie nie powinno się zbytnio zmieniać w nowszych wersjach.

Zawiera również kody kolorów -

Różowy : informacje nie są uwzględnione.

Pomarańczowy : funkcje nie są objęte gwarancją.

Żółty : gałęzie nie zakryte.

Pełne dokumenty w Stambule tutaj:

https://istanbul.js.org

Aby uzyskać bardziej szczegółową teorię dotyczącą pokrycia kodu:

https://en.wikipedia.org/wiki/Code_coverage

Mam nadzieję, że to pomoże!

Amy Pellegrini
źródło
8

Uruchomiony Stambuł powinien również wygenerować plik HTML raportu (powinien znajdować się w folderze pokrycia). Ten kod HTML powinien zawierać szczegółowe informacje po kliknięciu plików / folderów.

Odsetek pokrytych funkcji jest obliczany przez liczbę funkcji, które zostały wywołane podczas testów, podzieloną przez całkowitą liczbę funkcji. To samo dotyczy wierszy i instrukcji (które zwykle będą blisko siebie, chyba że masz bardzo długie instrukcje). Gałęzie oznaczają punkty decyzyjne, takie jak if-elsebloki. Na przykład, powiedzmy, że twój kod zawiera tylko jedną if-elseinstrukcję, a twoje testy przechodzą tylko przez ifczęść, ale nie przez elseczęść, wtedy procent twoich gałęzi powinien wynosić 50%.

Mam nadzieję, że to wszystko wyjaśnia.

Yaron Schwimmer
źródło
Prowadziłem Stambuł, podając dane "test" : "nyc mocha"w package.json. Mój folder pokrycia jest pusty. Myśli?
TheCrazyProgrammer
1
Dodałem reporter html. To teraz działa. "test" : "nyc --reporter=html mocha"
TheCrazyProgrammer
Na przykład: jeśli masz dużą gałąź if i małą gałąź else i uruchomiono tylko gałąź if, pokrycie linii będzie wyglądało świetnie, ale pokrycie gałęzi nadal będzie wynosić tylko 50%. Możesz również mieć wiele instrukcji w jednym wierszu, jeśli instrukcje są oddzielone średnikami lub jeśli wiersz zawiera definicję funkcji (która zawiera własne instrukcje). Możesz mieć wiele wierszy na instrukcję, jeśli instrukcja ma podziały wierszy przed końcowym średnikiem.
Hew Wolff
0

Dodawanie do poprzednich odpowiedzi

Oświadczenia% oblicza się, biorąc procent z liczby stwierdzeń objętych testem, np. 12/18 * 100 = 66,67%. Oznacza to, że Twój test obejmował tylko 66,67%.

Oddział% jest również obliczany w ten sam sposób. To samo dotyczy funkcji% i linii%.

W katalogu głównym projektu znajduje się folder pokrycia, który zawiera dane wyjściowe HTML testu. Kliknij na nią i wyświetl ją w przeglądarce. Powinieneś zobaczyć coś takiego

Obraz przedstawiający wyniki Twoich testów

Mam nadzieję, że pomoże ci to lepiej to zrozumieć.

Samuel Pinheiro
źródło