Jak uruchomić pojedynczy test przy użyciu Jest?

355

Mam test „działa z zagnieżdżonymi dziećmi” w pliku fix-order-test.js.

Uruchomienie poniżej uruchamia wszystkie testy w pliku.

jest fix-order-test

Jak przeprowadzić tylko jeden test? Poniższe nie działa, gdy szuka pliku określonego wyrażenia regularnego.

jest 'works with nested children'
vijayst
źródło
ponieważ używasz wiersza polecenia jest, prawdopodobnie poprzez npm, a następnie po prostu dodaj --testNamePattern 'works with nested children' Opcje Jest CLI #testNamePattern
steven87vt
@BioGenX: link jest teraz uszkodzony
Dan Dascalescu

Odpowiedzi:

427

Z wiersza polecenia użyj flagi --testNamePatternlub-t

jest -t 'fix-order-test'

Spowoduje to uruchomienie testów pasujących do podanego wzorca nazwy testu. Jest w dokumentach Jest .

Innym sposobem jest uruchomienie testów w trybie zegarka, jest --watcha następnie naciśnięcie przycisku w pcelu filtrowania testów poprzez wpisanie nazwy pliku testowego lub turuchomienie pojedynczej nazwy testu.


Jeśli masz itwnętrze describebloku, musisz biec

jest -t '<describeString> <itString>'
Andreas Köberle
źródło
Otrzymuję nierozpoznane opcje -t. Tak, dokumentacja o tym wspomina. Flaga została dodana w wersji 16.0. Jestem w najnowszej wersji. jest -help nie wspomina o fladze. Dzięki.
vijayst
12
Tylko uwaga, że ​​jest to wzorzec testowy dla konkretnej nazwy testu wewnątrz it()funkcji, a nie nazwa pliku. Tak myślałem.
HussienK
70
Jeśli używasz testu npm, musisz to zrobićnpm test -- -t "fix order test"
Sarsaparilla
3
To działa dla mnie, ale także pomija każdy inny test w projekcie, który jest powolny w przypadku dużych projektów. Określenie konkretnego pliku testowego, w którym znajduje się test, naprawdę pomaga:./node_modules/.bin/jest --config=./.jest.config.json ./src/x/y/sites.js/sitesWorker.test.js -t 'given only incorrect sites'
anon58192932
Działa dla mnie bez określania <describeString>, zauważyłem, że jest o wielkości wolniejsze niż grep mokki (-g 'searchString') - ale wezmę to :-)
schmoopy
124

Dokumentacja Jest zaleca, co następuje:

Jeśli test kończy się niepowodzeniem, jedną z pierwszych rzeczy do sprawdzenia powinno być sprawdzenie, czy test kończy się niepowodzeniem, gdy jest to jedyny test, który się uruchamia. W Jest jest łatwo uruchomić tylko jeden test - wystarczy tymczasowo zmienić to test polecenie natest.only

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

lub

it.only('this will be the only test that runs', () => {
   expect(true).toBe(false);
});
łuskowaty
źródło
7
Działa dla mnie z jest 20.0.4. Chociaż pomija tylko pozostałe testy w tym pliku. Testy w innych plikach są kontynuowane, chyba że już ograniczyłeś uruchamianie do jednego pliku.
Holf
7
Jest to jednak żart - ponieważ testy są uruchamiane asynchronicznie, prawdopodobnie nie można od początku ustalić, który test należy uruchomić w jakim pliku. Będzie więc domyślnie uruchamiał wszystkie pliki i WYKRYWA pliki test.only. Więc jeśli chcesz uruchomić tylko jeden test w pliku, który ma wiele przypadków testowych w pakiecie zestawów testów składających się z wielu plików, musisz niestety uruchomić ten pojedynczy plikjest myTestFile.test.js
niestabilny
@johnslay: Tak, właśnie przetestowałem
łuszczący się
@flaky Chyba chciałem powiedzieć, że nie działa podczas uruchamiania npm test. Będziesz musiał uruchomić plik sam lub naciśnij, paby ustawić filtr.
johnslay
3
@johnslay dobrze, dziękuję za przeczytanie poprzednich komentarzy przed napisaniem odpowiedzi Chyba / s :)
flaky
55

Jak wspomniano w innych odpowiedziach, test.onlypo prostu odfiltrowuje inne testy w tym samym pliku . Testy w innych plikach nadal by się uruchomiły.

Aby uruchomić pojedynczy test, istnieją dwa podejścia:

  • Opcja 1: jeśli Twoja nazwa testu jest unikalna, możesz wejść tw tryb zegarka i wprowadzić nazwę testu, który chcesz uruchomić.

  • Opcja 2:

    1. Naciśnij pw trybie zegarka, aby wprowadzić wyrażenie regularne dla nazwy pliku, który chcesz uruchomić. (Odpowiednie polecenia takie jak te są wyświetlane po uruchomieniu Jest w trybie zegarka).
    2. Zmiana itdo it.onlyna teście, który chcesz uruchomić.

W przypadku jednej z powyższych metod Jest uruchomi tylko jeden test w podanym pliku.

Cory House
źródło
53

Pełna komenda, aby uruchomić pojedynczy test Jest

Komenda:

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
    • Inne: node_modules/.bin/jest
  • -i <you-test-file>: ścieżka do pliku z testami ( jslub ts)
  • -c <jest-config>: ścieżka do osobnego pliku konfiguracyjnego Jest (JSON), jeśli zachowasz konfigurację Jest package.json, nie musisz określać tego parametru (Jest on znaleziony bez Twojej pomocy)
  • -t <the-name-of-test-block>: W rzeczywistości jest to nazwa (pierwszy parametr) z describe(...), it(...)lub test(...)bloku.

Przykład:

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

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

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

});

Więc polecenie

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

przetestuje it("1 + 1 = 2", ...), ale jeśli zmienisz -tparametr na "math tests", uruchomi oba testy z describe("math tests",...)bloku.

Uwagi:

  1. Dla Windows zastąpić node_modules/.bin/jestz node_modules\jest\bin\jest.js.
  2. To podejście umożliwia debugowanie działającego skryptu. Aby włączyć debugowanie, dodaj '--inspect-brk'parametr do polecenia.

Uruchamianie pojedynczego testu Jest za pomocą skryptów NPM w pakiecie.json

Po zainstalowaniu Jest możesz uprościć składnię tego polecenia (powyżej) za pomocą skryptów NPM . W "package.json"dodać nowy skrypt do "scripts"sekcji:

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

W takim przypadku używamy aliasu 'jest'zamiast pisać pełną ścieżkę do niego. Nie określamy również ścieżki do pliku konfiguracyjnego, ponieważ możemy go również umieścić, "package.json"a Jest to domyślnie sprawdzone. Teraz możesz uruchomić polecenie:

npm run test:math

i "math tests"blok z dwoma testami zostanie wykonany. Lub, oczywiście, możesz określić jeden konkretny test według jego nazwy.

Inną opcją byłoby wyciągnięcie <the-name-of-test-block>parametru poza "test:math"skrypt i przekazanie go z komendy NPM:

package.json:

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

Komenda:

npm run test:math "math tests"

Teraz możesz zarządzać nazwą testu (-ów) uruchamiania przy użyciu znacznie krótszej komendy.

Uwagi:

  1. 'jest'Komenda zadziała ze skryptami KMP ponieważ

    npm dokonuje "./node_modules/.bin"pierwszego wpisu w PATHzmiennej środowiskowej podczas uruchamiania dowolnych skryptów cyklu życia, więc będzie działać dobrze, nawet jeśli twój program nie jest zainstalowany globalnie ( blog NPM )

  2. Wydaje się, że to podejście nie pozwala na debugowanie, ponieważ Jest uruchamiany przez jego binarny / CLI , a nie przez node.

Uruchamianie wybranego testu Jest w programie Visual Studio Code

Jeśli korzystasz z programu Visual Studio Code, możesz z niego skorzystać i uruchomić aktualnie wybrany test (w edytorze kodu), naciskając F5przycisk. Aby to zrobić, musimy utworzyć nowy blok konfiguracji uruchamiania w ".vscode/launch.json"pliku. W tej konfiguracji użyjemy predefiniowanych zmiennych, które zostaną podstawione odpowiednimi (niestety nie zawsze ) wartościami podczas działania. Ze wszystkich dostępnych interesują nas tylko:

  • ${relativeFile} - aktualnie otwarty plik w stosunku do ${workspaceFolder}
  • ${selectedText} - aktualnie wybrany tekst w aktywnym pliku

Ale przed wypisaniem konfiguracji uruchamiania powinniśmy dodać 'test'skrypt do naszego 'package.json'(jeśli jeszcze go nie mamy).

package.json:

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

wtedy możemy go użyć w konfiguracji uruchamiania.

Uruchom konfigurację:

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

faktycznie robi to samo, co polecenia opisane wcześniej w tej odpowiedzi. Teraz, gdy wszystko jest gotowe, możemy uruchomić dowolny test bez konieczności ręcznego przepisywania parametrów polecenia.

Oto wszystko, co musisz zrobić:

  1. Wybierz aktualnie utworzoną konfigurację uruchamiania w panelu debugowania:

wybierz Uruchom konfigurację w panelu debugowania VSCode

  1. Otwórz plik z testami w edytorze kodu i wybierz nazwę testu, który chcesz przetestować (bez cudzysłowu):

wybierz nazwę testu

  1. Naciśnij 'F5'przycisk

I voila!

Teraz, aby uruchomić dowolny test, po prostu otwórz go w edytorze, wybierz jego nazwę i naciśnij F5.

Niestety, nie będzie to „voila” na komputerach z systemem Windows, ponieważ zastępują one (kto wie dlaczego) ${relativeFile}zmienną ścieżką z odwróconymi ukośnikami i Jest to ścieżka nie zrozumiana.

Uwagi:

  1. Aby uruchomić w ramach debugera, nie zapomnij dodać '--inspect-brk'parametru.
  2. W tym przykładzie konfiguracji nie mamy parametru konfiguracyjnego Jest, zakładając, że jest on uwzględniony 'package.json'.
Siergiej
źródło
1
Świetny! To powinna być zaakceptowana odpowiedź. Zwłaszcza jeśli dodaje wzmiankę o npxznacznym uproszczeniu wywoływania Jest, niezależnie od systemu operacyjnego.
Dan Dascalescu
19

Możesz także użyć flub, xaby skoncentrować lub wykluczyć test. Na przykład

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);
});
Nima Soroush
źródło
1
Nie jestem pewien, dlaczego ta odpowiedź została odrzucona, wydaje się, że odpowiada na pytanie i działa.
mbillard
1
xitdziałał dla mnie, ale fitnie działa. używam [email protected].
Hinrich
fitpracuje dla mnie w [email protected].
jcubic
Myślę, że główną wadą tego podejścia jest to, że - jeśli próbujesz tylko zgłębić jeden test, aby naprawić błąd - pociąga to za sobą niepotrzebne zmiany w podstawowych plikach testowych. Jeśli, z jakiegokolwiek powodu, chcesz zachować kod testowy (powiedzmy między zatwierdzeniami), może to mieć sens.
webelo
fdziała tylko w jednym pliku.
Sergey
14

Jak wspomniano powyżej, możesz uruchomić polecenie

jest -t 'fix-order-test'

Jeśli masz itwnętrze describebloku, musisz biec

jest -t '<describeString> <itString>'
Władimir Gramacho
źródło
13

Jeśli jestdziałasz jako polecenie skryptu, npm testmusisz użyć następującego polecenia, aby działało:

npm test -- -t "fix order test"
Mugur „Bud” Chirica
źródło
8

z najnowszą wersją jest , możesz użyć jednego z poniższych, aby uruchomić tylko jeden test, taki sam dla zestawu testów.

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

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

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

jest 'test 1' może również działać, jeśli nazwa testu jest unikalna.

kod Schrodingera
źródło
4

W VS Code pozwala mi to uruchomić / debugować tylko 1 Jest test, z punktami przerwania: https://github.com/Microsoft/vscode-recipes/tree/master/debugging-jest-tests

Mój launch.jsonma to w środku:

{
  "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",
      }
    }
  ]
}

i to w package.json:

  "scripts": {
    "test": "jest"
  }
  • Aby uruchomić 1 test, w tym teście zmień test(lub it) na test.only(lub it.only). Aby uruchomić 1 zestaw testów (kilka testów), zmień describena describe.only.
  • Jeśli chcesz, ustaw punkty przerwania.
  • W VS Code przejdź do widoku debugowania (Shift + Cmd + D).
  • Z rozwijanego menu u góry wybierz Jest Current File .
  • Kliknij zieloną strzałkę, aby uruchomić ten test.
Raymond Gan
źródło
W moim przypadku twoja konfiguracja uruchamia tylko jeden test (z it.only (...)), ale nie zatrzymuje się w
punktach
Uzyskiwanie JavaScript do osiągnięcia punktów przerwania w debuggerze może być trudne, ze względu na jego asynchroniczną naturę. W VS Code baw się z miejscem, w którym umieszczasz swoje punkty przerwania, oraz poleceniami w menu Debuguj, aż do ich trafienia. Jeśli nadal pomija punkty przerwania, umieść je WCZEŚNIEJ w swoim kodzie. Jeśli 1 plik wywołuje funkcję w innym pliku, umieść punkt przerwania w tym wywołaniu funkcji, a następnie „Krok w” wywołanie, aby przeskoczyć pliki. Graj za pomocą następujących poleceń debugowania: „Krok, krok do, wyjście, kontynuacja”
Raymond Gan,
Faktycznie, nie trzeba "scripts": { "test": "jest" }się package.jsondlatego, że podano pełną ścieżkę w "program"parametr launch.json.
Siergiej
3

Oto moje zdanie:

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

Uwagi:

  • ./node_modules/.bin/...to wspaniały sposób na uzyskanie dostępu do lokalnie zainstalowanego pliku binarnego jest (lub mokka lub ...) dostarczonego z lokalnie zainstalowanym pakietem. (tak, w skryptach npm nie można jestnic wcześniej zrobić , ale jest to przydatne w wierszu poleceń ... (to także dobry początek dla konfiguracji debugowania, niezależnie od tego, którego IDE używasz ...)
  • twój projekt może nie mieć zestawu opcji konfiguracji. Ale jeśli tak (zajrzyj do skryptów w package.json), to jest to, czego potrzebujesz.
  • --runInBand - jak powiedziano, nie wiem o swojej konfiguracji, ale jeśli koncentrujesz się na opracowaniu / naprawieniu pojedynczego testu, raczej nie chcesz zajmować się pracownikami sieci ...
  • tak, możesz podać całą, wyraźną ścieżkę do swojego pliku
  • opcjonalnie możesz użyć, -taby nie uruchamiać wszystkich testów w tym pliku, ale tylko jeden (tutaj: ten, który ma show expandedw nazwie coś z „ ”). Ten sam efekt można uzyskać poprzez przyklejenie .only()do tego pliku.
Frank Nocke
źródło
3

tylko mały dodatek, ponieważ wydaje się, że była jakaś walka, czy użyć, ./node_modules/.bin/jest -i ...czy tylko jest -i ...lubnpm test -- -i ...

  1. samo wywoływanie jestdziała, jeśli masz zainstalowane globalnie (jak npm npm install -g jest), niezbyt czysty sposób radzenia sobie z zależnościami
  2. jeśli masz zainstalowany tylko lokalnie w pakiecie i chcesz wywołać skrypt jest bez objazdu skryptu npm, możesz użyć npx jest -i ...=> właśnie do tego służy npx. ratuje cię przed pisaniem./node_modules/.bin/...
Armin Groll
źródło
0

Jest teraz ładna wtyczka dla tego, co nazywa się jest-watch-typeahead, dzięki czemu ten proces jest znacznie prostszy.

rivanov
źródło
0
npm run test -- test-name

Działa to tylko wtedy, gdy nazwa specyfikacji testu jest unikalna. Powyższy kod będzie się odnosił

plik o tej nazwie: test-name.component.spec.ts

tony2tones
źródło