¿Cómo ejecuto una sola prueba con Jest?

356

Tengo una prueba 'funciona con niños anidados' dentro del archivo fix-order-test.js.

Ejecutar lo siguiente ejecuta todas las pruebas en el archivo.

jest fix-order-test

¿Cómo ejecuto solo una prueba? Lo siguiente no funciona, ya que busca un archivo de la expresión regular especificada.

jest 'works with nested children'
vijayst
fuente
dado que está utilizando la línea de comando jest, probablemente a través de npm, simplemente agregue las --testNamePattern 'works with nested children' opciones de CLI de Jest #testNamePattern
steven87vt el
@BioGenX: el enlace ahora está roto
Dan Dascalescu

Respuestas:

429

Desde la línea de comando use la bandera --testNamePatterno-t

jest -t 'fix-order-test'

Esto solo ejecutará pruebas que coincidan con el patrón de nombre de prueba que proporcione. Está en los documentos de Jest .

Otra forma es ejecutar pruebas en modo reloj jest --watchy luego presionar ppara filtrar las pruebas escribiendo el nombre del archivo de prueba o tpara ejecutar un solo nombre de prueba.


Si tiene itdentro de un describebloque, debe ejecutar

jest -t '<describeString> <itString>'
Andreas Köberle
fuente
Recibo opciones no reconocidas para -t. Sí, la documentación lo menciona. La bandera se ha agregado en 16.0. Estoy en la última versión. jest -help no parece mencionar la bandera. Gracias.
vijayst 01 de
12
Solo una nota de que este es el patrón de prueba para el nombre de prueba específico dentro de la it()función y no el nombre del archivo. Que es lo que yo pensaba.
HussienK
70
Si usa la prueba npm, debe hacerlonpm test -- -t "fix order test"
zarzaparrilla
3
Esto funciona para mí, pero también omite todas las pruebas del proyecto, lo que es lento para proyectos grandes. Especificar un archivo de prueba específico en el que se encuentra la prueba realmente ayuda:./node_modules/.bin/jest --config=./.jest.config.json ./src/x/y/sites.js/sitesWorker.test.js -t 'given only incorrect sites'
anon58192932
Funciona para mí sin especificar <describeString>, me di cuenta de que es magnitudes más lentas que el grep de mocha (-g 'searchString'), pero lo tomaré :-)
schmoopy
125

La documentación de Jest recomienda lo siguiente:

Si una prueba falla, una de las primeras cosas que debe verificar es si la prueba falla cuando es la única prueba que se ejecuta. En Jest es simple ejecutar solo una prueba: simplemente cambie ese test comando temporalmente atest.only

test.only('this will be the only test that runs', () => {
   expect(true).toBe(false);
});

o

it.only('this will be the only test that runs', () => {
   expect(true).toBe(false);
});
escamoso
fuente
77
Funciona para mí con broma 20.0.4. Aunque solo omite el resto de las pruebas en ese archivo. Las pruebas en otros archivos continúan ejecutándose, a menos que ya haya restringido la ejecución a un solo archivo.
Holf
77
Sin embargo, eso es una broma: dado que ejecuta las pruebas de forma asincrónica, probablemente no pueda determinar qué prueba ejecutar en qué archivo desde el principio. Por lo tanto, ejecutará todos los archivos por defecto y DENTRO de los archivos buscar test.only. Entonces, si solo desea ejecutar una prueba dentro de un archivo que tiene muchos casos de prueba dentro de un conjunto de casos de prueba que consta de muchos archivos, desafortunadamente tiene que ejecutar ese único archivojest myTestFile.test.js
escamoso
@johnslay: Sí, solo lo probé
escamoso
@ Flaky Supongo que quería decir que no funciona cuando se ejecuta npm test. Tendrá que ejecutar el archivo solo o presionar ppara establecer un filtro.
johnslay
3
@johnslay bien, gracias por leer los comentarios anteriores antes de escribir tu respuesta, supongo / s :)
escamoso
55

Como se menciona en otras respuestas, test.onlysimplemente filtra otras pruebas en el mismo archivo . Entonces las pruebas en otros archivos aún se ejecutarían.

Entonces, para ejecutar una sola prueba, hay dos enfoques:

  • Opción 1: si el nombre de su prueba es único, puede ingresar tmientras está en modo de observación e ingresar el nombre de la prueba que desea ejecutar.

  • Opcion 2:

    1. Golpear p mientras estás en modo reloj para ingresar una expresión regular para el nombre de archivo que deseas ejecutar. (Los comandos relevantes como este se muestran cuando ejecuta Jest en modo reloj).
    2. Cambiar itait.only la prueba que desea ejecutar.

Con cualquiera de los enfoques anteriores, Jest solo ejecutará la prueba individual en el archivo que ha especificado.

Casa Cory
fuente
54

Comando completo para ejecutar una sola prueba de Jest

Mando:

node <path-to-jest> -i <you-test-file> -c <jest-config> -t "<test-block-name>"

  • <path-to-jest>:
    • Ventanas: node_modules\jest\bin\jest.js
    • Otros: node_modules/.bin/jest
  • -i <you-test-file>: ruta al archivo con pruebas ( jso ts)
  • -c <jest-config>: ruta a un archivo de configuración de Jest separado (JSON), si mantiene su configuración de Jest package.jsonno tiene que especificar este parámetro (Jest lo encontrará sin su ayuda)
  • -t <the-name-of-test-block>: En realidad, es un nombre (el primer parámetro) de describe(...), it(...)o test(...)bloque.

Ejemplo:

describe("math tests", () => {

  it("1 + 1 = 2", () => {
    expect(1 + 1).toBe(2);
  });

  it("-1 * -1 !== -1", () => {
    expect(-1 * -1).not.toBe(-1);
  });

});

Entonces, el comando

node node_modules/jest/bin/jest.js -i test/math-tests.js -c test/tests-config.json -t "1 + 1 = 2"

probará it("1 + 1 = 2", ...), pero si cambia el -tparámetro a "math tests", ejecutará ambas pruebas desde el describe("math tests",...)bloque.

Observaciones:

  1. Para Windows, reemplace node_modules/.bin/jestconnode_modules\jest\bin\jest.js .
  2. Este enfoque le permite depurar el script en ejecución. Para habilitar la depuración, agregue el '--inspect-brk'parámetro al comando.

Ejecutando una sola prueba de Jest a través de scripts NPM en 'package.json'

Una vez instalado Jest, puede simplificar la sintaxis de este comando (arriba) mediante el uso de scripts NPM . En "package.json"agregar un nuevo script a la "scripts"sección:

"scripts": {
  "test:math": "jest -i test/my-tests.js -t \"math tests\"",
}

En este caso, usamos un alias en 'jest'lugar de escribir la ruta completa. Además, no especificamos la ruta del archivo de configuración, ya que también podemos "package.json"ubicarla y Jest la examinará de forma predeterminada. Ahora puedes ejecutar el comando:

npm run test:math

y "math tests"se ejecutará el bloque con dos pruebas. O, por supuesto, puede especificar una prueba en particular por su nombre.

Otra opción sería extraer el <the-name-of-test-block>parámetro fuera del "test:math"script y pasarlo desde el comando NPM:

package.json:

"scripts": {
  "test:math": "jest -i test/my-tests.js -t",
}

Mando:

npm run test:math "math tests"

Ahora puede administrar el nombre de la (s) prueba (s) de ejecución con un comando mucho más corto.

Observaciones:

  1. El 'jest'comando funcionará con scripts NPM porque

    npm realiza "./node_modules/.bin"la primera entrada en la PATHvariable de entorno cuando ejecuta scripts de ciclo de vida, por lo que funcionará bien, incluso si su programa no está instalado globalmente ( blog de NPM )

  2. Este enfoque no parece permitir la depuración porque Jest se ejecuta a través de su binario / CLI , no a través de node.

Ejecutando la prueba Jest seleccionada en Visual Studio Code

Si está utilizando Visual Studio Code, puede aprovecharlo y ejecutar la prueba seleccionada actualmente (en el editor de código) presionando el F5botón. Para hacer esto, necesitaremos crear un nuevo bloque de configuración de inicio en el ".vscode/launch.json"archivo. En esa configuración, utilizaremos variables predefinidas que se sustituyen por las apropiadas (desafortunadamente valores no siempre ) cuando se ejecuta. De todos los disponibles solo nos interesan estos:

  • ${relativeFile} - el archivo abierto actual relativo a ${workspaceFolder}
  • ${selectedText} - el texto seleccionado actual en el archivo activo

Pero antes de escribir la configuración de lanzamiento debemos agregar el 'test' script en nuestro 'package.json'(si aún no lo tenemos).

package.json:

"scripts": {
  "test": "jest"
}

entonces podemos usarlo en nuestra configuración de lanzamiento.

Configuración de lanzamiento:

{
  "type": "node",
  "request": "launch",
  "name": "Run selected Jest test",
  "runtimeExecutable": "npm",
  "runtimeArgs": [
    "run-script",
    "test"
  ],
  "args": [
    "--",
    "-i",
    "${relativeFile}",
    "-t",
    "${selectedText}"
  ],
  "console": "integratedTerminal",
}

en realidad hace lo mismo que los comandos descritos anteriormente en esta respuesta. Ahora que todo está listo, podemos ejecutar cualquier prueba que queramos sin tener que reescribir los parámetros del comando manualmente.

Esto es todo lo que necesitas hacer:

  1. Seleccione la configuración de inicio creada actualmente en el panel de depuración:

seleccione la configuración de inicio en el panel de depuración de VSCode

  1. Abra el archivo con pruebas en el editor de código y seleccione el nombre de la prueba que desea probar (sin comillas):

seleccione el nombre de la prueba

  1. Presione el 'F5'botón

¡Y voilá!

Ahora para ejecutar cualquier prueba que desee simplemente ábrala en el editor, seleccione su nombre y presione F5.

Desafortunadamente, no será "voila" en las máquinas con Windows porque sustituyen (quién sabe por qué) la ${relativeFile}variable con la ruta que ha invertido las barras inclinadas y Jest no entendería esa ruta.

Observaciones:

  1. Para ejecutar bajo el depurador, no olvide agregar el '--inspect-brk' parámetro.
  2. En este ejemplo de configuración, no tenemos el parámetro de configuración de Jest asumiendo que está incluido 'package.json'.
Sergey
fuente
1
¡Excelente! Esta debería ser la respuesta aceptada. Especialmente si agrega una mención npxpara simplificar enormemente las llamadas a Jest, independientemente del sistema operativo.
Dan Dascalescu
19

También puede usar fo xpara enfocar o excluir una prueba. Por ejemplo

fit('only this test will run', () => {
   expect(true).toBe(false);
});

it('this test will not run', () => {
   expect(true).toBe(false);
});

xit('this test will be ignored', () => {
   expect(true).toBe(false);
});
Nima Soroush
fuente
1
No estoy seguro de por qué esta respuesta fue rechazada, parece responder a la pregunta y funciona.
mbillard
1
xitfuncionó para mí, pero fitno funciona. Estoy usando [email protected].
Hinrich
fitfunciona en [email protected] para mí.
jcubic
Creo que el principal inconveniente de este enfoque es que, si solo está tratando de profundizar en una prueba para corregir un error, implica cambios innecesarios en los archivos de prueba subyacentes. Si, por alguna razón, desea mantener el código de prueba (a través de confirmaciones, por ejemplo), esto podría tener sentido.
webelo
ffunciona solo dentro de un archivo.
Sergey
14

Como se dijo anteriormente, puede ejecutar el comando

jest -t 'fix-order-test'

Si tiene itdentro de un describebloque, debe ejecutar

jest -t '<describeString> <itString>'
Wladimir Gramacho
fuente
13

Si se está jestejecutando como un comando de script, algo así npm test, debe usar el siguiente comando para que funcione:

npm test -- -t "fix order test"
Mugur 'Bud' Chirica
fuente
8

con la última versión de jest , puede usar uno de los siguientes para ejecutar solo una prueba, la misma para el conjunto de pruebas.

it.only('test 1', () => {})

test.only('test 1', () => {})

fit('test 1', () => {})

jest 'test 1' puede funcionar también si el nombre de la prueba es único.

código de schrodinger
fuente
4

En VS Code, esto me permite ejecutar / depurar solo 1 prueba de Jest, con puntos de interrupción: https://github.com/Microsoft/vscode-recipes/tree/master/debugging-jest-tests

Mi launch.jsontiene esto adentro:

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Jest All",
      "program": "${workspaceFolder}/node_modules/.bin/jest",
      "args": ["--runInBand"],
      "console": "integratedTerminal",
      "internalConsoleOptions": "neverOpen",
      "windows": {
        "program": "${workspaceFolder}/node_modules/jest/bin/jest",
      }
    },
    {
      "type": "node",
      "request": "launch",
      "name": "Jest Current File",
      "program": "${workspaceFolder}/node_modules/.bin/jest",
      "args": ["${relativeFile}"],
      "console": "integratedTerminal",
      "internalConsoleOptions": "neverOpen",
      "windows": {
        "program": "${workspaceFolder}/node_modules/jest/bin/jest",
      }
    }
  ]
}

y esto en package.json:

  "scripts": {
    "test": "jest"
  }
  • Para ejecutar 1 prueba, en esa prueba, cambie test(o it) a test.only(o it.only). Para ejecutar 1 conjunto de pruebas (varias pruebas), cambie describea describe.only.
  • Establezca puntos de interrupción si lo desea.
  • En VS Code, vaya a Vista de depuración (Shift + Cmd + D).
  • Desde el menú desplegable en la parte superior, seleccione Jest Current File .
  • Haga clic en la flecha verde para ejecutar esa prueba.
Raymond Gan
fuente
En mi caso, su configuración solo ejecuta una prueba (solo con ella (...)), pero no se detiene en los puntos de interrupción :(
Tudor Leustean
Conseguir que JavaScript llegue a puntos de interrupción en un depurador puede ser complicado, debido a su naturaleza asincrónica. En VS Code, juegue con el lugar donde coloca sus puntos de interrupción, más los comandos en el menú Depurar, hasta que los golpee. Si sigue omitiendo puntos de interrupción, colóquelos ANTES en su código. Si 1 archivo llama a una función en otro archivo, coloque el punto de interrupción en esa llamada a la función, luego "ingrese" a la llamada para saltar archivos. Juega con estos comandos de depuración: "Paso, paso, paso, salida"
Raymond Gan
En realidad, no es necesario "scripts": { "test": "jest" }en la package.jsoncausa que ha especificado la ruta completa en el "program"parámetro launch.json.
Sergey
4

solo un pequeño complemento, porque parece que hubo una especie de pelea si usar ./node_modules/.bin/jest -i ...o simplemente jest -i ...onpm test -- -i ...

  1. simplemente llamar jestfunciona si lo tiene instalado globalmente (como con npm install -g jest), una forma no tan limpia de manejar dependencias
  2. si ha instalado jest solo localmente en el paquete y desea llamar al script jest sin el desvío del script npm, puede usar npx jest -i ...=> para eso es exactamente npx. te salva de escribir./node_modules/.bin/...
Armin Groll
fuente
3

Aquí está mi opinión:

./node_modules/.bin/jest --config test/jest-unit-config.json --runInBand src/components/OpenForm/OpenForm.spec.js -t 'show expanded'

Notas:

  • ./node_modules/.bin/...es una forma maravillosa de acceder al binario jest (o mocha o ...) instalado localmente que viene con el paquete instalado localmente. (sí, en sus scripts npm no puede hacer jestnada antes, pero esto es útil en la línea de comandos ... (eso también es un buen comienzo para su configuración de depuración, cualquier IDE que esté usando ...)
  • Es posible que su proyecto no tenga un conjunto de opciones de configuración. Pero si lo hace (eche un vistazo a los scripts package.json), esto es lo que necesita.
  • --runInBand - como se dijo, no sé acerca de su configuración, pero si se concentra en desarrollar / arreglar una sola prueba, prefiere no tratar con trabajadores web ...
  • sí, puede dar la ruta completa y explícita a su archivo
  • opcionalmente , puede usar -tpara no ejecutar todas las pruebas en ese archivo, sino solo una (aquí: la que tiene algo con ' show expanded' en su nombre). Se puede lograr el mismo efecto pegando .only()en ese archivo.
Frank Nocke
fuente
0

Ahora hay un buen complemento de broma para esto llamado jest-watch-typeaheadque hace que este proceso sea mucho más simple.

rivanov
fuente
0
npm run test -- test-name

Esto solo funcionará si el nombre de la especificación de prueba es único. El código anterior haría referencia

un archivo con este nombre: test-name.component.spec.ts

tony2tones
fuente