Como executar testes Jest sequencialmente?

141

Estou executando testes Jest via npm test. Jest executa testes em paralelo por padrão. Existe alguma maneira de executar os testes sequencialmente?

Eu tenho alguns testes chamando código de terceiros que depende da alteração do diretório de trabalho atual.

Martin Konicek
fonte

Respostas:

221

Opções CLI são documentados e também acessível através da execução do comando jest --help.

Você verá a opção que você está procurando: --runInBand.

ncuillery
fonte
5
Muito obrigado! É isso npm test --runInBand? Offtopic: não sei de onde vem o nome "band". --runSequentially provavelmente faria mais sentido :) #
Martin Konicek
13
@MartinKonicek npm test -- --runInBandestá correto.
Ondrej Slinták 22/02
40
Infelizmente, o fato de a ordem de execução não poder ser controlada torna o Jest praticamente inútil para testes de integração.
Evan B.
19
@ Evan O fato de você precisar realizar seus testes em uma determinada ordem é um cheiro.
Nico Van Belle
18
@NicoVanBelle É simplesmente o preço que você paga por um verdadeiro teste de ponta a ponta de sistemas stateful suficientemente complexos. Estou aberto a alternativas, mas ainda não vi uma solução que não envolva trocar ingenuamente partes importantes da pilha ou proibir redefinições proibitivamente lentas do banco de dados entre testes. Não significa que o Jest seja uma ferramenta ruim, apenas a errada para esse tipo de teste em particular.
Evan B.
17

Ainda estou me familiarizando com o Jest, mas parece que os blocos de descrição são executados de forma síncrona, enquanto os blocos de teste são executados de forma assíncrona. Estou executando vários blocos de descrição dentro de uma descrição externa que se parece com isso:

describe
    describe
        test1
        test2

    describe
        test3

Nesse caso, test3não é executado até que test2esteja completo porque test3está em um bloco de descrição que segue o bloco de descrição que contém test2.

SuperCodeBrah
fonte
1
Talvez ainda funcione em paralelo.
LCB
Isso é ótimo. Torna possível verificar primeiro o comportamento com variáveis ​​de ambiente ausentes, depois definir as variáveis ​​e fazer testes adicionais.
Attaque
14

Ele trabalhou para mim, garantindo a execução sequencial de testes bem separados para módulos:

1) Mantenha os testes em arquivos separados, mas sem spec/testnomear.

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

2) O arquivo com o conjunto de testes também deve ter a seguinte aparência (testSuite1.js):

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

3) Importe-os para testToRunSequentially.test.jse execute com --runInBand:

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

describe('sequentially run tests', () => {
   testSuite1()
   testSuite2()
})
kmnowak
fonte
Você não precisa executar com --runInBand, pois você já possui dois conjuntos de testes. Os conjuntos de testes filhos são executados em sequência.
RICKY KUMAR
10

Use o corredor de teste serial:

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

Configure o jest para usá-lo, por exemplo, em jest.config.js:

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

Você pode usar o recurso de projeto para aplicá-lo apenas a um subconjunto de testes. Consulte https://jestjs.io/docs/en/configuration#projects-arraystring--projectconfig

Joachim Lous
fonte
Você pode usar o recurso de projeto para usá-lo apenas em um subconjunto de testes. , Como?
Nux
1
@Nux A configuração de 'projetos' no Jest permite aplicar outras configurações de forma seletiva a conjuntos de testes específicos. Resposta atualizada com link para documentos e exemplo.
Joachim Lous
4

Como copiado 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
fonte