Codeabdeckung mit Mokka

288

Ich verwende Mocha zum Testen meiner NodeJS-Anwendung. Ich kann nicht herausfinden, wie die Codeabdeckungsfunktion verwendet wird. Ich habe versucht, es zu googeln, aber kein richtiges Tutorial gefunden. Bitte helfen Sie.

Tusharmath
quelle

Antworten:

410

Sie benötigen eine zusätzliche Bibliothek für die Codeabdeckung, und Sie werden begeistert sein, wie leistungsfähig und einfach Istanbul ist. Versuchen Sie Folgendes, nachdem Sie Ihre Mokka-Tests bestanden haben:

npm install nyc

Platzieren Sie nun einfach den Befehl nyc vor Ihrem vorhandenen Testbefehl, zum Beispiel:

{
  "scripts": {
    "test": "nyc mocha"
  }
}
Dan Kohn
quelle
30
Wenn Sie eine lokal installierte Version von Mokka ausführen, versuchen Sie es istanbul cover node_modules/mocha/bin/_mocha.
Eric McCarthy
102
Oder installieren Sie sowohl Istanbul als auch Mokka lokal und fügen Sie dem Skriptabschnitt Ihrer package.json Folgendes hinzu und führen Sie dann nur npm Coverage aus: "Coverage": "./node_modules/istanbul/lib/cli.js cover ./node_modules/ mocha / bin / _mocha - --ui bdd -R spec -t 5000
Dan Kohn
6
Ich hatte Probleme, diesen Befehl unter Windows auszuführen, aber durch Angabe des vollständigen Pfads zum Mokka-Behälter konnte ich ihn zum Laufen bringen. istanbul.cmd cover C:\Users\{UserName}\AppData\Roaming\npm\node_modules\mocha\bin\_mocha
Jason Jarrett
4
$(npm bin)ist eine kanonische Verknüpfung zu ./node_modules/.bin/und istanbul/lib/cli.jsist istanbulim bin-Ordner aliasiert . Also hier ist ein kürzerer Befehl:$(npm bin)/istanbul cover $(npm bin)/_mocha -- --ui bdd -R spec -t 5000
Henry Blyth
19
@ Windows-Benutzer:istanbul cover node_modules/mocha/bin/_mocha -- -R spec
Pier-Luc Gendreau
150

Jetzt ( 2020 ) wird Istanbul bevorzugt über die "State-of-the-Art-Befehlszeilenschnittstelle" nyc verwendet .

Installieren

Installieren Sie es zunächst in Ihrem Projekt mit

npm i nyc --save-dev

Wenn Sie ein npm-basiertes Projekt haben, ändern scriptsSie einfach das Testskript im Objekt Ihrer Datei package.json , um die Codeabdeckung Ihrer Mokka- Tests auszuführen :

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

Lauf

Führen Sie nun Ihre Tests aus

npm test

und Sie werden eine Tabelle wie diese in Ihrer Konsole sehen, gleich nach der Ausgabe Ihrer Tests:

Istanbul Nyc Mocha Code-Abdeckung

Anpassung

HTML-Bericht

Benutz einfach

nyc --reporter=html

statt text. Jetzt wird ein Bericht erstellt ./coverage/index.html.

Berichtsformate

Istanbul unterstützt eine Vielzahl von Berichtsformaten. Schauen Sie sich einfach die Berichtsbibliothek an, um die für Sie nützlichste zu finden. Fügen --reporter=REPORTER_NAMESie einfach eine Option für jedes gewünschte Format hinzu. Zum Beispiel mit

nyc --reporter=html --reporter=text

Sie haben sowohl die Konsole als auch den HTML-Bericht.

Führen Sie keine Abdeckung mit dem npm-Test durch

Fügen Sie einfach ein weiteres Skript in Ihr Skript ein package.jsonund lassen Sie das testSkript nur bei Ihrem Testläufer (z. B. Mokka):

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

Führen Sie nun dieses benutzerdefinierte Skript aus

npm run test-with-coverage

Tests mit Codeabdeckung ausführen.

Test erzwingen fehlgeschlagen, wenn die Codeabdeckung gering ist

Fehler, wenn die gesamte Codeabdeckung unter 90% liegt:

nyc --check-coverage --lines 90 

Fehler, wenn die Codeabdeckung von mindestens einer Datei unter 90% liegt:

nyc --check-coverage --lines 90 --per-file
lifeisfoo
quelle
2
Dies funktioniert auch perfekt für Jasmin: "nyc --reporter = html jasmine"
Sandip Subedi
12
danke für das Hinzufügen von "now (2017)" - wirklich hilfreich in dieser sich schnell bewegenden Javascript-Welt
kamahl
2
Für den Fall, dass jemand anderes verwirrt war - das npm-Repository istanbul scheint von nyc abgelöst worden zu sein . Gemäß den aufgeführten Abhängigkeiten wurde Istanbul in verschiedene Pakete aufgeteilt, die alle in ihrem Istanbuljs Monorepo
aaaaaa
1
Ich habe die --reporter=htmlaktiviert, aber die HTML-Datei ist immer leer, es wird nichts über nicht abgedeckte Blöcke oder% abgedeckt usw. angezeigt, nur Überschriften der Tabelle
TGW
1
Also ... ein Framework namens Istanbul, dessen CLI-Befehl NYC ist? äh ... ich vertraue es nicht!
Tivie
19

Blanket.js funktioniert auch perfekt.

npm install --save-dev blanket

vor Ihrem test / tests.js

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

Lauf mocha -R html-cov > coverage.html

jsan
quelle
require ('blanket') ({pattern: function (Dateiname) {return! /node_modules/.test (Dateiname);}});
jsan
4
Ab 2015 wird blanket.js nicht mehr gepflegt und unterstützt ES6 nicht mehr. Istanbul ist sehr zu empfehlen.
Teroi