Jak sekwencyjnie uruchamiać testy Jest?

140

Prowadzę testy Jest przez npm test. Jest domyślnie uruchamia testy równolegle. Czy istnieje sposób, aby testy były uruchamiane sekwencyjnie?

Mam kilka testów wywołujących kod innej firmy, który polega na zmianie bieżącego katalogu roboczego.

Martin Konicek
źródło

Odpowiedzi:

220

Opcje interfejsu wiersza polecenia są udokumentowane i dostępne również po uruchomieniu polecenia jest --help.

Zobaczysz opcję szukasz: --runInBand.

szubienica
źródło
5
Wielkie dzięki! Czy to jest npm test --runInBand? Offtopic: Nie jestem pewien, skąd pochodzi nazwa „zespół”. --runSekwencyjnie pewnie miałoby więcej sensu :)
Martin Konicek
13
@MartinKonicek npm test -- --runInBandma rację.
Ondrej Slinták
40
Niestety, fakt, że nie można kontrolować kolejności wykonania, sprawia, że ​​Jest praktycznie bezużyteczny w testach integracyjnych.
Evan B.
19
@Evan Fakt, że testy muszą być wykonywane w określonej kolejności, to zapach.
Nico Van Belle
18
@NicoVanBelle To po prostu cena, jaką płacisz za prawdziwe, kompleksowe testowanie wystarczająco złożonych systemów stanowych. Jestem otwarty na alternatywy, ale nie widziałem jeszcze rozwiązania, które nie wymaga naiwnej zamiany kluczowych części stosu lub zbyt wolnego resetowania bazy danych między testami. Nie oznacza to, że Jest to złe narzędzie, tylko niewłaściwe do tego konkretnego rodzaju testu.
Evan B.
17

Wciąż poznaję Jest, ale wydaje się, że opisywanie bloków jest wykonywane synchronicznie, podczas gdy bloki testowe działają asynchronicznie. Uruchamiam wiele bloków opisu w ramach zewnętrznego opisu, który wygląda mniej więcej tak:

describe
    describe
        test1
        test2

    describe
        test3

W tym przypadku test3nie działa, dopóki nie test2zostanie zakończona, ponieważ test3znajduje się w bloku opisu, który następuje po bloku opisu, który zawiera test2.

SuperCodeBrah
źródło
1
Może nadal będzie działać równolegle.
LCB
To jest świetne. Umożliwia najpierw sprawdzenie zachowania z brakującymi zmiennymi środowiskowymi, następnie ustawienie zmiennych i wykonanie dalszych testów.
Attaque
14

U mnie zadziałało zapewniając sekwencyjne uruchamianie ładnie rozdzielonych na moduły testów:

1) Przechowuj testy w oddzielnych plikach, ale bez spec/testnazewnictwa.

|__testsToRunSequentially.test.js
|__tests
   |__testSuite1.js
   |__testSuite2.js
   |__index.js

2) Plik z zestawem testów również powinien wyglądać tak (testSuite1.js):

export const testSuite1 = () => describe(/*your suite inside*/)

3) Zaimportuj je do testToRunSequentially.test.jsi uruchom z --runInBand:

import { testSuite1, testSuite2 } from './tests'

describe('sequentially run tests', () => {
   testSuite1()
   testSuite2()
})
kmnowak
źródło
Nie musisz uruchamiać z --runInBand, ponieważ masz już dwa zestawy testowe. Podrzędne zestawy testów są wykonywane po kolei.
RICKY KUMAR
10

Użyj seryjnego programu uruchamiającego testy:

npm install jest-serial-runner --save-dev

Ustaw żart, aby go używać, np. W jest.config.js:

module.exports = {
   ...,
   runner: 'jest-serial-runner'
};

Możesz użyć funkcji projektu, aby zastosować ją tylko do podzbioru testów. Zobacz https://jestjs.io/docs/en/configuration#projects-arraystring--projectconfig

Joachim Lous
źródło
Możesz użyć funkcji projektu, aby użyć go tylko dla podzbioru testów. , W jaki sposób?
Nux
1
@Nux Ustawienie „projekty” w programie Jest umożliwia selektywne stosowanie innych ustawień konfiguracyjnych do określonych zestawów testów. Odpowiedź zaktualizowana z linkiem do dokumentów i przykładem.
Joachim Lous
4

Jak skopiowano z https://github.com/facebook/jest/issues/6194#issuecomment-419837314

test.spec.js

import { signuptests } from './signup'
import { logintests } from './login'

describe('Signup', signuptests)
describe('Login', logintests)

signup.js

export const signuptests = () => {
     it('Should have login elements', () => {});
     it('Should Signup', () => {}});
}

login.js

export const logintests = () => {
    it('Should Login', () => {}});
}
Mor Shemesh
źródło