Wie führe ich einen einzelnen Test mit Jest durch?


355

Ich habe einen Test 'arbeitet mit verschachtelten Kindern' in der Datei fix-order-test.js.

Durch Ausführen der folgenden Schritte werden alle Tests in der Datei ausgeführt.

jest fix-order-test

Wie führe ich nur einen einzigen Test durch? Das Folgende funktioniert nicht, da nach einer Datei mit dem angegebenen regulären Ausdruck gesucht wird.

jest 'works with nested children'

1
Werfen

Da Sie die Jest-Befehlszeile verwenden, fügen Sie wahrscheinlich bis npm die --testNamePattern 'works with nested children' Jest-CLI-Optionen #testNamePattern
steven87vt

@ BioGenX: Link ist jetzt unterbrochen
Dan Dascalescu

Antworten:


427

Verwenden Sie in der Befehlszeile das Flag --testNamePatternoder-t

jest -t 'fix-order-test'

Dadurch werden nur Tests ausgeführt, die dem von Ihnen angegebenen Testnamenmuster entsprechen. Es ist in den Jest-Dokumenten .

Eine andere Möglichkeit besteht darin, Tests im Überwachungsmodus auszuführen jest --watchund dann zu drücken p, um die Tests durch Eingabe des Testdateinamens zu filtern oder teinen einzelnen Testnamen auszuführen.


Wenn Sie ein itInneres eines describeBlocks haben, müssen Sie laufen

jest -t '<describeString> <itString>'

Ich erhalte nicht erkannte Optionen für -t. Ja, die Dokumentation erwähnt es. Das Flag wurde in 16.0 hinzugefügt. Ich bin auf der neuesten Version. jest -help scheint die Flagge nicht zu erwähnen. Vielen Dank.
Vijayst

12
Nur ein Hinweis, dass dies das Testmuster für den spezifischen Testnamen innerhalb der it()Funktion und nicht der Dateiname ist. Welches ist, was ich dachte.
HussienK

70
Wenn Sie npm Test verwenden, müssen Sie tunnpm test -- -t "fix order test"
Sarsaparilla

3
Dies funktioniert für mich, überspringt aber auch jeden einzelnen anderen Test im Projekt, der für große Projekte langsam ist. Das Angeben einer bestimmten Testdatei, in der sich der Test befindet, hilft wirklich:./node_modules/.bin/jest --config=./.jest.config.json ./src/x/y/sites.js/sitesWorker.test.js -t 'given only incorrect sites'
anon58192932

Funktioniert für mich ohne Angabe von <describeString>. Ich habe festgestellt, dass es um Größenordnungen langsamer ist als Mokkas grep (-g 'searchString') - aber ich nehme es an :-)
schmoopy

124

Die Scherzdokumentation empfiehlt Folgendes:

Wenn ein Test fehlschlägt, sollte als erstes überprüft werden, ob der Test fehlschlägt, wenn er der einzige Test ist, der ausgeführt wird. In Jest ist es einfach, nur einen Test auszuführen - ändern Sie diesen test Befehl nur vorübergehend in atest.only

test.only('this will be the only test that runs', () => {
   expect(true).toBe(false);
});

oder

it.only('this will be the only test that runs', () => {
   expect(true).toBe(false);
});

7
Funktioniert für mich mit Scherz 20.0.4. Obwohl nur der Rest der Tests in dieser Datei übersprungen wird. Tests in anderen Dateien werden weiterhin ausgeführt, es sei denn, Sie haben die Ausführung bereits auf eine Datei beschränkt.
Holf

7
Das ist allerdings ein Scherz - da die Tests asynchron ausgeführt werden, kann es wahrscheinlich nicht von Anfang an bestimmen, welcher Test in welcher Datei ausgeführt werden soll. Es werden also standardmäßig alle Dateien ausgeführt und INNERHALB der Dateien wird nach gesucht test.only. Wenn Sie also nur einen Test in einer Datei ausführen möchten, die viele Testfälle in einer Reihe von Testfällen enthält, die aus vielen Dateien bestehen, müssen Sie diese einzelne Datei leider ausführenjest myTestFile.test.js
flockig

@ Johnslay: Es tut, gerade getestet
schuppig

@flaky Ich denke, ich wollte sagen, dass es beim Laufen nicht funktioniert npm test. Sie müssen die Datei selbst ausführen oder drücken p, um einen Filter festzulegen.
Johnslay

3
@ Johnslay gut, danke für das Lesen der vorherigen Kommentare vor dem Schreiben Ihrer Antwort Ich denke / s :)
flockig

55

Wie in anderen Antworten erwähnt, werden test.onlylediglich andere Tests in derselben Datei herausgefiltert . Tests in anderen Dateien würden also weiterhin ausgeführt.

Um einen einzelnen Test durchzuführen, gibt es zwei Ansätze:

  • Option 1: Wenn Ihr Testname eindeutig ist, können Sie tim Überwachungsmodus den Namen des Tests eingeben, den Sie ausführen möchten.

  • Option 2:

    1. Drücken Sie pim Überwachungsmodus, um einen regulären Ausdruck für den Dateinamen einzugeben, den Sie ausführen möchten. (Relevante Befehle wie dieser werden angezeigt, wenn Sie Jest im Überwachungsmodus ausführen.)
    2. Wechseln Sie itzu it.onlydem Test, den Sie ausführen möchten.

Bei beiden oben genannten Ansätzen führt Jest nur den einzelnen Test in der von Ihnen angegebenen Datei aus.


54

Vollständiger Befehl zum Ausführen eines einzelnen Scherztests

Befehl:

node <path-to-jest> -i <you-test-file> -c <jest-config> -t "<test-block-name>"

  • <path-to-jest>::
    • Windows: node_modules\jest\bin\jest.js
    • Andere: node_modules/.bin/jest
  • -i <you-test-file>: Pfad zur Datei mit Tests ( jsoder ts)
  • -c <jest-config>: Pfad zu einer separaten Jest-Konfigurationsdatei (JSON). Wenn Sie Ihre Jest-Konfiguration beibehalten, müssen package.jsonSie diesen Parameter nicht angeben (Jest findet ihn ohne Ihre Hilfe).
  • -t <the-name-of-test-block>: Es ist eigentlich ein Name (der erste Parameter) von describe(...), it(...)oder test(...)Block.

Beispiel:

describe("math tests", () => {

  it("1 + 1 = 2", () => {
    expect(1 + 1).toBe(2);
  });

  it("-1 * -1 !== -1", () => {
    expect(-1 * -1).not.toBe(-1);
  });

});

Also der Befehl

node node_modules/jest/bin/jest.js -i test/math-tests.js -c test/tests-config.json -t "1 + 1 = 2"

wird getestet it("1 + 1 = 2", ...), aber wenn Sie den -tParameter auf ändern , "math tests"werden beide Tests vom describe("math tests",...)Block ausgeführt.

Bemerkungen:

  1. Für Windows ersetzen node_modules/.bin/jestdurch node_modules\jest\bin\jest.js.
  2. Mit diesem Ansatz können Sie das laufende Skript debuggen. Um das Debuggen zu aktivieren, fügen Sie '--inspect-brk'dem Befehl einen Parameter hinzu.

Ausführen eines einzelnen Scherztests über NPM-Skripte in 'package.json'

Wenn Sie Jest installiert haben, können Sie die Syntax dieses Befehls (oben) mithilfe von NPM-Skripten vereinfachen . In "package.json"fügen Sie ein neues Skript zu dem "scripts"Abschnitt:

"scripts": {
  "test:math": "jest -i test/my-tests.js -t \"math tests\"",
}

In diesem Fall verwenden wir einen Alias, 'jest'anstatt den vollständigen Pfad dorthin zu schreiben. Außerdem geben wir den Pfad der Konfigurationsdatei nicht an, da wir ihn "package.json"auch einfügen können und Jest ihn standardmäßig überprüft. Jetzt können Sie den folgenden Befehl ausführen:

npm run test:math

und der "math tests"Block mit zwei Tests wird ausgeführt. Natürlich können Sie einen bestimmten Test auch anhand seines Namens angeben.

Eine andere Möglichkeit wäre, den <the-name-of-test-block>Parameter aus dem "test:math"Skript zu ziehen und ihn vom NPM-Befehl zu übergeben:

package.json:

"scripts": {
  "test:math": "jest -i test/my-tests.js -t",
}

Befehl:

npm run test:math "math tests"

Jetzt können Sie den Namen der Lauftests mit einem viel kürzeren Befehl verwalten.

Bemerkungen:

  1. Das 'jest' Befehl funktioniert mit NPM-Skripten, weil

    npm macht "./node_modules/.bin"den ersten Eintrag in der PATHUmgebungsvariablen, wenn Lebenszyklus-Skripte ausgeführt werden. Dies funktioniert also auch dann, wenn Ihr Programm nicht global installiert ist ( NPM-Blog ).

  2. Dieser Ansatz scheint das Debuggen nicht zuzulassen, da Jest über seine Binär- / CLI-Datei ausgeführt wird , nicht über node.

Ausführen des ausgewählten Scherztests in Visual Studio Code

Wenn Sie Visual Studio Code verwenden, können Sie diesen nutzen und den aktuell ausgewählten Test (im Code-Editor) ausführen, indem Sie die F5Taste drücken. Dazu müssen wir einen neuen Startkonfigurationsblock in der ".vscode/launch.json"Datei erstellen. In dieser Konfiguration werden vordefinierte Variablen verwendet, die beim Ausführen durch die entsprechenden (leider nicht immer ) Werte ersetzt werden. Von allen verfügbaren sind wir nur an folgenden interessiert:

  • ${relativeFile} - die aktuell geöffnete Datei relativ zu ${workspaceFolder}
  • ${selectedText} - der aktuell ausgewählte Text in der aktiven Datei

Aber bevor wir die Startkonfiguration schreiben, sollten wir das 'test'Skript in unsere hinzufügen 'package.json'(falls wir es noch nicht haben).

package.json:

"scripts": {
  "test": "jest"
}

dann können wir es in unserer Startkonfiguration verwenden.

Konfiguration starten:

{
  "type": "node",
  "request": "launch",
  "name": "Run selected Jest test",
  "runtimeExecutable": "npm",
  "runtimeArgs": [
    "run-script",
    "test"
  ],
  "args": [
    "--",
    "-i",
    "${relativeFile}",
    "-t",
    "${selectedText}"
  ],
  "console": "integratedTerminal",
}

Es funktioniert tatsächlich genauso wie die zuvor in dieser Antwort beschriebenen Befehle. Nachdem alles fertig ist, können wir jeden gewünschten Test ausführen, ohne die Befehlsparameter manuell neu schreiben zu müssen.

Hier ist alles, was Sie tun müssen:

  1. Wählen Sie im Debug-Bereich die aktuell erstellte Startkonfiguration aus:

Wählen Sie im VSCode-Debug-Bereich Startkonfiguration aus

  1. Öffnen Sie die Datei mit Tests im Code-Editor und wählen Sie den Namen des Tests aus, den Sie testen möchten (ohne Anführungszeichen):

Wählen Sie den Testnamen

  1. Drücken Sie 'F5'Taste.

Und voila!

Um nun einen beliebigen Test auszuführen, öffnen Sie ihn einfach im Editor, wählen Sie seinen Namen aus und drücken Sie F5.

Leider wird es auf Windows-Computern nicht "voila" sein, da sie (wer weiß warum) die ${relativeFile}Variable durch den Pfad mit umgekehrten Schrägstrichen ersetzen und Jest einen solchen Pfad nicht verstehen würde.

Bemerkungen:

  1. Vergessen Sie nicht, den '--inspect-brk'Parameter hinzuzufügen, um unter dem Debugger ausgeführt zu werden.
  2. In diesem Konfigurationsbeispiel haben wir keinen Jest-Konfigurationsparameter, vorausgesetzt, er ist in enthalten 'package.json'.

1
Ausgezeichnet! Dies sollte die akzeptierte Antwort sein. Vor allem, wenn erwähnt wird npx, dass das Aufrufen von Jest unabhängig vom Betriebssystem erheblich vereinfacht wird.
Dan Dascalescu

19

Sie können einen Test auch verwenden foder xfokussieren oder ausschließen. Zum Beispiel

fit('only this test will run', () => {
   expect(true).toBe(false);
});

it('this test will not run', () => {
   expect(true).toBe(false);
});

xit('this test will be ignored', () => {
   expect(true).toBe(false);
});

1
Nicht sicher, warum diese Antwort abgelehnt wurde, scheint sie die Frage zu beantworten und funktioniert.
mbillard

1
xithat für mich gearbeitet, aber fitnicht. Ich benutze jest@22.4.4.
Hinrich

fitarbeitet in jest@23.1.0 für mich.
Jcubic

Ich denke, dass der Hauptnachteil dieses Ansatzes darin besteht, dass - wenn Sie nur versuchen, einen Test durchzuführen, um einen Fehler zu beheben - unnötige Änderungen an den zugrunde liegenden Testdateien erforderlich sind. Wenn Sie aus irgendeinem Grund den Testcode beibehalten möchten (z. B. über Commits hinweg), ist dies möglicherweise sinnvoll.
Webelo

fEs funktioniert nur innerhalb einer Datei.
Sergey

14

Wie oben erwähnt, können Sie den Befehl ausführen

jest -t 'fix-order-test'

Wenn Sie ein itInneres eines describeBlocks haben, müssen Sie laufen

jest -t '<describeString> <itString>'

13

Wenn Sie jestals Skriptbefehl ausgeführt haben, müssen npm testSie den folgenden Befehl verwenden, damit er funktioniert:

npm test -- -t "fix order test"

8

Mit der neuesten Scherzversion können Sie eine der folgenden Methoden verwenden , um nur einen Test auszuführen, der auch für die Testsuite gilt.

it.only('test 1', () => {})

test.only('test 1', () => {})

fit('test 1', () => {})

jest 'test 1' funktioniert möglicherweise auch, wenn der Testname eindeutig ist.


4

In VS Code konnte ich nur 1 Jest-Test mit Haltepunkten ausführen / debuggen: https://github.com/Microsoft/vscode-recipes/tree/master/debugging-jest-tests

Mein launch.jsonhat das drinnen:

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Jest All",
      "program": "${workspaceFolder}/node_modules/.bin/jest",
      "args": ["--runInBand"],
      "console": "integratedTerminal",
      "internalConsoleOptions": "neverOpen",
      "windows": {
        "program": "${workspaceFolder}/node_modules/jest/bin/jest",
      }
    },
    {
      "type": "node",
      "request": "launch",
      "name": "Jest Current File",
      "program": "${workspaceFolder}/node_modules/.bin/jest",
      "args": ["${relativeFile}"],
      "console": "integratedTerminal",
      "internalConsoleOptions": "neverOpen",
      "windows": {
        "program": "${workspaceFolder}/node_modules/jest/bin/jest",
      }
    }
  ]
}

und das in package.json:

  "scripts": {
    "test": "jest"
  }
  • Um 1 Test auszuführen, ändern Sie in diesem Test test(oder it) in test.only(oder it.only). Um 1 Testsuite (mehrere Tests) auszuführen, wechseln Sie describezu describe.only.
  • Stellen Sie Haltepunkte ein, wenn Sie möchten.
  • Wechseln Sie im VS-Code zur Debug-Ansicht (Umschalt + Befehlstaste + D).
  • Wählen Sie im Dropdown-Menü oben die Option aus Jest Current File.
  • Klicken Sie auf den grünen Pfeil, um diesen Test auszuführen.

In meinem Fall führt Ihre Konfiguration nur einen Test aus (nur mit it.on (...)), aber sie hört nicht an Haltepunkten auf :(
Tudor Leustean

Es kann aufgrund seiner asynchronen Natur schwierig sein, JavaScript dazu zu bringen, Haltepunkte in einem Debugger zu erreichen. Spielen Sie in VS Code damit, wo Sie Ihre Haltepunkte platzieren, sowie mit den Befehlen im Debug-Menü, bis sie sie treffen. Wenn Haltepunkte weiterhin übersprungen werden, platzieren Sie sie FRÜHER in Ihrem Code. Wenn 1 Datei eine Funktion in einer anderen Datei aufruft, setzen Sie einen Haltepunkt bei diesem Funktionsaufruf und "Schritt in" den Aufruf, um Dateien zu überspringen. Spielen Sie mit diesen Debug-Befehlen: "Step Over, Step Into, Step Out, Continue"
Raymond Gan

Eigentlich brauchen Sie nicht "scripts": { "test": "jest" }in, package.jsonweil Sie den vollständigen Pfad im "program"Parameter in angegeben haben launch.json.
Sergey

3

Hier ist meine Einstellung:

./node_modules/.bin/jest --config test/jest-unit-config.json --runInBand src/components/OpenForm/OpenForm.spec.js -t 'show expanded'

Anmerkungen:

  • ./node_modules/.bin/...ist eine wunderbare Möglichkeit, auf die lokal installierte Scherz- (oder Mokka- oder ...) Binärdatei zuzugreifen, die mit dem lokal installierten Paket geliefert wurde. (Ja, in Ihren npm-Skripten können Sie jestmit nichts zuvor, aber dies ist praktisch in der Befehlszeile ... (das ist auch ein guter Anfang für Ihre Debugging-Konfiguration, unabhängig davon, welche IDE Sie verwenden ...)
  • Ihr Projekt verfügt möglicherweise nicht über eine Reihe von Konfigurationsoptionen. Aber wenn dies der Fall ist (werfen Sie einen Blick in die Skripte in package.json), ist dies das, was Sie brauchen.
  • --runInBand - Wie gesagt, Sie wissen nichts über Ihre Konfiguration, aber wenn Sie sich darauf konzentrieren, einen einzelnen Test zu entwickeln / zu reparieren, möchten Sie sich lieber nicht mit Web-Workern befassen ...
  • Ja, Sie können den gesamten expliziten Pfad zu Ihrer Datei angeben
  • Optional können Sie -tnicht alle Tests in dieser Datei ausführen, sondern nur einen einzigen (hier: den, show expandeddessen Name etwas mit ' ' enthält). Der gleiche Effekt kann durch Einkleben .only()in diese Datei erzielt werden .

3

nur ein kleines Add-On, denn es scheint, dass es eine Art Kampf gab, ob man es benutzt ./node_modules/.bin/jest -i ...oder nur jest -i ...odernpm test -- -i ...

  1. Nur das Aufrufen jestfunktioniert, wenn Sie es global installiert haben (wie bei npm install -g jest), eine nicht so saubere Art, mit Abhängigkeiten umzugehen
  2. Wenn Sie Jest nur lokal im Paket installiert haben und das Jest-Skript ohne den Umweg des npm-Skripts aufrufen möchten, können Sie npx jest -i ...=> verwenden. Genau dafür ist npx gedacht. erspart Ihnen das Schreiben./node_modules/.bin/...


0
npm run test -- test-name

Dies funktioniert nur, wenn der Name Ihrer Testspezifikation eindeutig ist. Der obige Code würde verweisen

eine Datei mit diesem Namen: test-name.component.spec.ts

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.