Wie führe ich Jest-Tests nacheinander durch?

140

Ich führe Scherztests über durch npm test. Jest führt Tests standardmäßig parallel aus. Gibt es eine Möglichkeit, die Tests nacheinander auszuführen?

Ich habe einige Tests, bei denen Code von Drittanbietern aufgerufen wird, bei denen das aktuelle Arbeitsverzeichnis geändert wird.

Martin Konicek
quelle

Antworten:

220

CLI-Optionen werden dokumentiert und können auch durch Ausführen des Befehls aufgerufen werden jest --help.

Sie sehen die Option, nach der Sie suchen : --runInBand.

ncuillery
quelle
5
Vielen Dank! Ist es npm test --runInBand? Offtopic: Ich bin mir nicht sicher, woher der Name "Band" kommt. - RunSequential würde wahrscheinlich mehr Sinn machen :)
Martin Konicek
13
@ MartinKonicek npm test -- --runInBandist korrekt.
Ondrej Slinták
40
Leider macht die Tatsache, dass die Ausführungsreihenfolge nicht gesteuert werden kann, Jest für Integrationstests so gut wie unbrauchbar.
Evan B.
19
@Evan Die Tatsache, dass Sie Ihre Tests in einer bestimmten Reihenfolge ausführen müssen, ist ein Geruch.
Nico Van Belle
18
@NicoVanBelle Es ist einfach der Preis, den Sie für echte End-to-End-Tests ausreichend komplexer Stateful-Systeme zahlen. Ich bin offen für Alternativen, aber ich habe noch keine Lösung gefunden, die weder das naive Austauschen wichtiger Teile des Stapels noch das unzulässige langsame Zurücksetzen der Datenbank zwischen den Tests beinhaltet. Das bedeutet nicht, dass Jest ein schlechtes Werkzeug ist, nur das falsche für diese spezielle Art von Test.
Evan B.
17

Ich bin immer noch mit Jest vertraut, aber es scheint, dass Beschreibungsblöcke synchron ausgeführt werden, während Testblöcke asynchron ausgeführt werden. Ich führe mehrere Beschreibungsblöcke innerhalb einer äußeren Beschreibung aus, die ungefähr so ​​aussieht:

describe
    describe
        test1
        test2

    describe
        test3

In diesem Fall test3wird erst ausgeführt, wenn der Vorgang test2abgeschlossen ist, da er test3sich in einem Beschreibungsblock befindet, der auf den Beschreibungsblock folgt, der ihn enthält test2.

SuperCodeBrah
quelle
1
Vielleicht läuft es noch parallel.
LCB
Das ist toll. Ermöglicht es, zuerst das Verhalten mit fehlenden Umgebungsvariablen zu überprüfen, dann die Variablen festzulegen und weitere Tests durchzuführen.
Attaque
14

Es hat bei mir funktioniert, um sicherzustellen, dass sequentiell laufende Tests zu Modulen durchgeführt werden:

1) Bewahren Sie Tests in getrennten Dateien auf, jedoch ohne spec/testBenennung.

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

2) Die Datei mit der Testsuite sollte auch so aussehen (testSuite1.js):

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

3) Importieren Sie sie in testToRunSequentially.test.jsund führen Sie sie aus mit --runInBand:

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

describe('sequentially run tests', () => {
   testSuite1()
   testSuite2()
})
kmnowak
quelle
Sie müssen nicht mit --runInBand ausgeführt werden, da Sie bereits zwei Testsuiten haben. Child Test Suites werden nacheinander ausgeführt.
Ricky Kumar
10

Verwenden Sie den seriellen Testläufer:

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

Richten Sie jest ein, um es zu verwenden, z. B. in jest.config.js:

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

Sie können die Projektfunktion verwenden, um sie nur auf eine Teilmenge von Tests anzuwenden. Siehe https://jestjs.io/docs/en/configuration#projects-arraystring--projectconfig

Joachim Lous
quelle
Sie können die Projektfunktion verwenden, um sie nur für eine Teilmenge von Tests zu verwenden. , Wie?
Nux
1
@Nux Mit der Konfigurationseinstellung 'Projekte' in Jest können Sie andere Konfigurationseinstellungen selektiv auf bestimmte Testgruppen anwenden. Antwort aktualisiert mit Link zu Dokumenten und Beispiel.
Joachim Lous
4

Wie von https://github.com/facebook/jest/issues/6194#issuecomment-419837314 kopiert

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
quelle