¿Cómo ejecutar las pruebas de Jest secuencialmente?

141

Estoy ejecutando pruebas de Jest vía npm test. Jest ejecuta pruebas en paralelo de forma predeterminada. ¿Hay alguna forma de hacer que las pruebas se ejecuten secuencialmente?

Tengo algunas pruebas que llaman a código de terceros que se basa en cambiar el directorio de trabajo actual.

Martin Konicek
fuente

Respuestas:

221

Las opciones de CLI están documentadas y también son accesibles ejecutando el comando jest --help.

Verá la opción que está buscando: --runInBand.

ncuillery
fuente
55
¡Muchas gracias! Es npm test --runInBand? Offtopic: No estoy seguro de dónde viene el nombre "banda". --runSequentially probablemente tendría más sentido :)
Martin Konicek
13
@MartinKonicek npm test -- --runInBandes correcto.
Ondrej Slinták
40
Desafortunadamente, el hecho de que la orden de ejecución no se pueda controlar hace que Jest sea bastante inútil para las pruebas de integración.
Evan B.
19
@Evan El hecho de que necesites que tus pruebas se ejecuten en cierto orden es un olor.
Nico Van Belle
18
@NicoVanBelle Es simplemente el precio que paga por las verdaderas pruebas de extremo a extremo de sistemas con estado suficientemente complejos. Estoy abierto a alternativas, pero aún no he visto una solución que no implique intercambiar ingenuamente partes clave de la pila o restablecimientos prohibitivos de la base de datos entre pruebas. No significa que Jest sea una mala herramienta, solo la incorrecta para este tipo particular de prueba.
Evan B.
17

Todavía me estoy familiarizando con Jest, pero parece que los bloques de descripción se ejecutan sincrónicamente, mientras que los bloques de prueba se ejecutan de forma asincrónica. Estoy ejecutando múltiples bloques de descripción dentro de una descripción externa que se parece a esto:

describe
    describe
        test1
        test2

    describe
        test3

En este caso, test3no se ejecuta hasta que test2se completa porque test3está en un bloque de descripción que sigue al bloque de descripción que contiene test2.

SuperCodeBrah
fuente
1
Tal vez todavía se ejecutará en paralelo.
LCB
Esto es genial. Hace posible verificar primero el comportamiento con las variables de entorno que faltan, luego establecer las variables y hacer más pruebas.
Ataque
14

Funcionó para mí asegurando la ejecución secuencial de pruebas bien separadas para módulos:

1) Mantenga las pruebas en archivos separados, pero sin spec/testnombrarlos.

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

2) El archivo con el conjunto de pruebas también debería tener este aspecto (testSuite1.js):

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

3) Importarlos testToRunSequentially.test.jsy ejecutarlos con --runInBand:

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

describe('sequentially run tests', () => {
   testSuite1()
   testSuite2()
})
kmnowak
fuente
No necesita ejecutar con --runInBand ya que ya tiene dos suites de prueba. Los conjuntos de pruebas secundarias se ejecutan en secuencia.
RICKY KUMAR
10

Utilice el corredor de prueba en serie:

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

Configure jest para usarlo, por ejemplo, en jest.config.js:

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

Puede usar la función de proyecto para aplicarla solo a un subconjunto de pruebas. Ver https://jestjs.io/docs/en/configuration#projects-arraystring--projectconfig

Joachim Lous
fuente
Puede usar la función de proyecto para usarla solo para un subconjunto de pruebas. , ¿Cómo?
Nux
1
@Nux La configuración de configuración de 'proyectos' en Jest le permite aplicar otras configuraciones de configuración selectivamente a conjuntos específicos de pruebas. Respuesta actualizada con enlace a documentos y ejemplo.
Joachim Lous
4

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
fuente