Pokrycie kodu Mocha

288

Używam Mocha do testowania mojej aplikacji NodeJS. Nie jestem w stanie dowiedzieć się, jak korzystać z funkcji pokrycia kodu. Próbowałem google, ale nie znalazłem odpowiedniego tutoriala. Proszę pomóż.

Tusharmath
źródło

Odpowiedzi:

410

Potrzebujesz dodatkowej biblioteki do pokrycia kodu, a oczaruje Cię, jak potężny i łatwy jest Stambuł . Po zaliczeniu testów mokki spróbuj wykonać następujące czynności:

npm install nyc

Teraz po prostu umieść polecenie nyc przed istniejącym poleceniem testowym, na przykład:

{
  "scripts": {
    "test": "nyc mocha"
  }
}
Dan Kohn
źródło
30
A jeśli używasz zainstalowanej lokalnie wersji mokki, spróbuj istanbul cover node_modules/mocha/bin/_mocha.
Eric McCarthy
102
Lub zainstaluj lokalnie zarówno Stambuł, jak i mokkę, a następnie dodaj do sekcji skryptów pliku package.json, a następnie po prostu uruchom npm run pokrycie: „pokrycie”: „./node_modules/istanbul/lib/cli.js cover ./node_modules/ mocha / bin / _mocha - --ui bdd -R spec -t 5000
Dan Kohn
6
Miałem problem z uruchomieniem tego polecenia w systemie Windows, ale podając pełną ścieżkę do kosza mokki, udało mi się go uruchomić. istanbul.cmd cover C:\Users\{UserName}\AppData\Roaming\npm\node_modules\mocha\bin\_mocha
Jason Jarrett,
4
$(npm bin)jest kanonicznym skrótem do ./node_modules/.bin/iistanbul/lib/cli.js jest aliasem istanbulw folderze bin. Oto krótsze polecenie:$(npm bin)/istanbul cover $(npm bin)/_mocha -- --ui bdd -R spec -t 5000
Henry Blyth,
19
@ Użytkownicy systemu Windows:istanbul cover node_modules/mocha/bin/_mocha -- -R spec
Pier-Luc Gendreau,
150

Teraz ( 2020 ) preferowanym sposobem korzystania ze Stambułu jest „najnowocześniejszy interfejs wiersza poleceń” nyc .

Ustawiać

Najpierw zainstaluj go w swoim projekcie za pomocą

npm i nyc --save-dev

Następnie, jeśli masz projekt oparty na npm, po prostu zmień skrypt testowy wewnątrz scriptsobiektu pliku package.json , aby wykonać pokrycie kodu testów mokka :

{
  "scripts": {
    "test": "nyc --reporter=text mocha"
  }
}

Biegać

Teraz uruchom testy

npm test

i zobaczysz taką konsolę w konsoli, zaraz po zakończeniu testów:

Zasięg kodu Istanbul Nyc Mocha

Dostosowywanie

Raport HTML

Po prostu użyj

nyc --reporter=html

zamiast text . Teraz wygeneruje raport w środku ./coverage/index.html.

Formaty raportów

Stambuł obsługuje szeroki zakres formatów raportów. Wystarczy spojrzeć na bibliotekę raportów, aby znaleźć najbardziej przydatne dla Ciebie. Po prostu dodaj --reporter=REPORTER_NAMEopcję dla każdego formatu, który chcesz. Na przykład za pomocą

nyc --reporter=html --reporter=text

będziesz mieć zarówno konsolę, jak i raport HTML.

Nie uruchamiaj pokrycia testem npm

Po prostu dodaj do skryptu kolejny skrypt package.jsoni zostaw go testze swoim testerem (np. Mokka):

{
  "scripts": {
    "test": "mocha",
    "test-with-coverage": "nyc --reporter=text mocha"
  }
}

Teraz uruchom ten niestandardowy skrypt

npm run test-with-coverage

przeprowadzać testy z pokryciem kodu.

Test wymuszenia kończy się niepowodzeniem, jeśli zasięg kodu jest niski

Niepowodzenie, jeśli całkowity zasięg kodu wynosi poniżej 90%:

nyc --check-coverage --lines 90 

Niepowodzenie, jeśli zasięg kodu co najmniej jednego pliku jest mniejszy niż 90%:

nyc --check-coverage --lines 90 --per-file
lifeisfoo
źródło
2
Działa to doskonale również dla jaśminu: „nyc --reporter = html jaśmin”
Sandip Subedi
12
dzięki za dodanie słowa „teraz (2017)” - naprawdę pomocne w tym szybko zmieniającym się świecie javascript
kamahl
2
W przypadku, gdy ktoś był zdezorientowany - wydaje się, że repozytorium npm istanbul zostało zastąpione przez nyc . Zgodnie z wymienionymi zależnościami, Stambuł został podzielony na różne pakiety, które wszystkie są przechowywane w ich monorepo istanbuljs
aaaaaa
1
Mam --reporter=htmlwłączone, ale plik html jest zawsze pusty, nic nie jest pokazywane w niepokrytych blokach lub% pokrytych itp. Tylko nagłówki tabeli
TGW
2
Więc ... framework o nazwie Stambuł, którego poleceniem CLI jest NYC? err ... Nie ufam temu!
Tivie,
19

Blanket.js również działa idealnie.

npm install --save-dev blanket

przed twoim testem / tests.js

require('blanket')({
    pattern: function (filename) {
        return !/node_modules/.test(filename);
    }
});

biegać mocha -R html-cov > coverage.html

jsan
źródło
wymagają („koc”) ({wzorzec: funkcja (nazwa pliku) {return! /node_modules/.test (nazwa pliku);}});
jsan
4
Począwszy od 2015 r., Blanket.js nie jest już obsługiwany i nie obsługuje ES6. Zdecydowanie zaleca się Stambuł.
teroi