Comment exécuter des tests Jest de manière séquentielle?

141

J'exécute des tests Jest via npm test. Jest exécute des tests en parallèle par défaut. Existe-t-il un moyen de faire exécuter les tests de manière séquentielle?

J'ai quelques tests appelant du code tiers qui repose sur la modification du répertoire de travail actuel.

Martin Konicek
la source

Réponses:

221

Les options CLI sont documentées et également accessibles en exécutant la commande jest --help.

Vous verrez l'option que vous recherchez: --runInBand.

ncuillerie
la source
5
Merci beaucoup! C'est ça npm test --runInBand? Offtopic: Je ne sais pas d'où vient le nom "groupe". --runSimilairement aurait probablement plus de sens :)
Martin Konicek
13
@MartinKonicek a npm test -- --runInBandraison.
Ondrej Slinták
40
Malheureusement, le fait que l'ordre d'exécution ne puisse pas être contrôlé rend Jest pratiquement inutile pour les tests d'intégration.
Evan B.
19
@Evan Le fait que vous ayez besoin que vos tests soient exécutés dans un certain ordre est une odeur.
Nico Van Belle
18
@NicoVanBelle C'est tout simplement le prix que vous payez pour de véritables tests de bout en bout de systèmes avec état suffisamment complexes. Je suis ouvert à des alternatives, mais je n'ai pas encore vu de solution qui n'implique ni l'échange naïf de parties clés de la pile, ni les réinitialisations de base de données trop lentes entre les tests. Cela ne veut pas dire que Jest est un mauvais outil, juste le mauvais pour ce type de test particulier.
Evan B.
17

Je me familiarise toujours avec Jest, mais il semble que les blocs de description fonctionnent de manière synchrone alors que les blocs de test fonctionnent de manière asynchrone. J'exécute plusieurs blocs de description dans une description externe qui ressemble à ceci:

describe
    describe
        test1
        test2

    describe
        test3

Dans ce cas, test3ne s'exécute pas tant que test2n'est pas terminé car il se test3trouve dans un bloc de description qui suit le bloc de description qui contient test2.

SuperCodeBrah
la source
1
Peut-être que cela fonctionnera toujours en parallèle.
LCB
C'est bien. Permet de vérifier d'abord le comportement avec des variables d'environnement manquantes, puis de définir les variables et d'effectuer d'autres tests.
Attaque
14

Cela a fonctionné pour moi en assurant l'exécution séquentielle de tests bien séparés en modules:

1) Conservez les tests dans des fichiers séparés, mais sans spec/testnom.

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

2) Le fichier avec la suite de tests devrait également ressembler à ceci (testSuite1.js):

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

3) Importez-les testToRunSequentially.test.jset exécutez-les avec --runInBand:

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

describe('sequentially run tests', () => {
   testSuite1()
   testSuite2()
})
kmnowak
la source
Vous n'avez pas besoin d'exécuter avec --runInBand puisque vous avez déjà deux suites de tests. Les suites de tests enfants sont exécutées dans l'ordre.
RICKY KUMAR
10

Utilisez le programme d'exécution de tests en série:

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

Configurez jest pour l'utiliser, par exemple dans jest.config.js:

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

Vous pouvez utiliser la fonctionnalité de projet pour l'appliquer uniquement à un sous-ensemble de tests. Voir https://jestjs.io/docs/en/configuration#projects-arraystring--projectconfig

Joachim Lous
la source
Vous pouvez utiliser la fonctionnalité de projet pour l'utiliser uniquement pour un sous-ensemble de tests. , Comment?
Nux le
1
@Nux Le paramètre de configuration «projets» dans Jest vous permet d'appliquer d'autres paramètres de configuration de manière sélective à des ensembles spécifiques de tests. Réponse mise à jour avec un lien vers des documents et un exemple.
Joachim Lous le
4

Tel que copié de 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
la source