Comment exécuter un seul test à l'aide de Jest?

356

J'ai un test «fonctionne avec des enfants imbriqués» dans le fichier fix-order-test.js.

L'exécution de ce qui suit exécute tous les tests du fichier.

jest fix-order-test

Comment exécuter un seul test? Ce qui suit ne fonctionne pas car il recherche un fichier de l'expression régulière spécifiée.

jest 'works with nested children'
vijayst
la source
depuis votre utilisation de la ligne de commande jest, probablement via npm, ajoutez simplement les --testNamePattern 'works with nested children' options CLI Jest #testNamePattern
steven87vt
@BioGenX: le lien est maintenant rompu
Dan Dascalescu

Réponses:

429

À partir de la ligne de commande, utilisez l' indicateur --testNamePatternou-t

jest -t 'fix-order-test'

Cela exécutera uniquement les tests correspondant au modèle de nom de test que vous fournissez. C'est dans les documents Jest .

Une autre façon consiste à exécuter des tests en mode montre, jest --watchpuis à appuyer sur ppour filtrer les tests en tapant le nom du fichier de test ou tpour exécuter un seul nom de test.


Si vous avez l' itintérieur d'un describebloc, vous devez exécuter

jest -t '<describeString> <itString>'
Andreas Köberle
la source
Je reçois des options non reconnues pour -t. Oui, la documentation le mentionne. Le drapeau a été ajouté en 16.0. Je suis sur la dernière version. jest -help ne semble pas mentionner le drapeau. Merci.
vijayst
12
Juste une note qu'il s'agit du modèle de test pour le nom de test spécifique à l'intérieur de la it()fonction et non du nom de fichier. C'est ce que je pensais.
HussienK
70
Si vous utilisez le test npm, vous devez le fairenpm test -- -t "fix order test"
Salsepareille
3
Cela fonctionne pour moi, mais il saute également tous les autres tests du projet, ce qui est lent pour les grands projets. Spécifier un fichier de test spécifique dans lequel se trouve le test aide vraiment:./node_modules/.bin/jest --config=./.jest.config.json ./src/x/y/sites.js/sitesWorker.test.js -t 'given only incorrect sites'
anon58192932
Fonctionne pour moi sans spécifier <describeString>, j'ai remarqué que les magnitudes sont plus lentes que grep de mocha (-g 'searchString') - mais je vais le prendre :-)
schmoopy
125

La documentation Jest recommande ce qui suit:

Si un test échoue, l'une des premières choses à vérifier doit être de savoir si le test échoue alors que c'est le seul test qui s'exécute. Dans Jest, il est simple d'exécuter un seul test - changez simplement temporairement cette test commande entest.only

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

ou

it.only('this will be the only test that runs', () => {
   expect(true).toBe(false);
});
floconneux
la source
7
Fonctionne pour moi avec jest 20.0.4. Bien qu'il ne saute que le reste des tests de ce fichier. Les tests dans d'autres fichiers continuent de s'exécuter, sauf si vous avez déjà limité l'exécution à un seul fichier.
Holf
7
C'est une plaisanterie cependant - car il exécute les tests de manière asynchrone, il ne peut probablement pas déterminer quel test exécuter dans quel fichier depuis le début. Il exécutera donc tous les fichiers par défaut et DANS LES fichiers, vérifiez test.only. Donc, si vous ne souhaitez exécuter qu'un seul test dans un fichier contenant de nombreux cas de test dans une suite de tests qui se compose de nombreux fichiers, vous devez malheureusement exécuter ce seul fichierjest myTestFile.test.js
flaky
@johnslay: Oui, juste testé
flaky
@flaky Je suppose que je voulais dire que cela ne fonctionne pas lors de l'exécution npm test. Vous devrez exécuter le fichier lui-même ou appuyer sur ppour définir un filtre.
johnslay
3
@johnslay bien, merci d'avoir lu les commentaires précédents avant d'écrire votre réponse je suppose / s :)
floconneux
55

Comme mentionné dans d'autres réponses, test.onlyfiltre simplement les autres tests dans le même fichier . Les tests dans d'autres fichiers continueraient donc de s'exécuter.

Donc, pour exécuter un seul test, il existe deux approches:

  • Option 1: si le nom de votre test est unique, vous pouvez entrer ten mode montre et saisir le nom du test que vous souhaitez exécuter.

  • Option 2:

    1. Frappez pen mode veille pour entrer une expression régulière pour le nom de fichier que vous souhaitez exécuter. (Des commandes pertinentes comme celle-ci s'affichent lorsque vous exécutez Jest en mode montre).
    2. Passez itau it.onlytest que vous souhaitez exécuter.

Avec l'une des approches ci-dessus, Jest exécutera uniquement le test unique dans le fichier que vous avez spécifié.

Maison Cory
la source
54

Commande complète pour exécuter un seul test Jest

Commander:

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

  • <path-to-jest>:
    • Les fenêtres: node_modules\jest\bin\jest.js
    • Autres: node_modules/.bin/jest
  • -i <you-test-file>: chemin d'accès au fichier avec tests ( jsou ts)
  • -c <jest-config>: chemin vers un fichier de configuration Jest séparé (JSON), si vous conservez votre configuration Jest, package.jsonvous n'avez pas besoin de spécifier ce paramètre (Jest le trouvera sans votre aide)
  • -t <the-name-of-test-block>: En fait , il est un nom (le premier paramètre) de describe(...), it(...)ou test(...)bloc.

Exemple:

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

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

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

});

Ainsi, la commande

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

testera it("1 + 1 = 2", ...), mais si vous changez le -tparamètre en, "math tests"il exécutera les deux tests à partir du describe("math tests",...)bloc.

Remarques:

  1. Pour Windows, remplacez node_modules/.bin/jestpar node_modules\jest\bin\jest.js.
  2. Cette approche vous permet de déboguer le script en cours d'exécution. Pour activer le débogage, ajoutez un '--inspect-brk'paramètre à la commande.

Exécution d'un seul test Jest via des scripts NPM dans 'package.json'

Une fois Jest installé, vous pouvez simplifier la syntaxe de cette commande (ci-dessus) en utilisant des scripts NPM . Pour "package.json"ajouter un nouveau script à la "scripts"section:

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

Dans ce cas, nous utilisons un alias 'jest'au lieu d'y écrire le chemin complet. De plus, nous ne spécifions pas le chemin du fichier de configuration car nous pouvons également le placer "package.json"et Jest l'examinera par défaut. Vous pouvez maintenant exécuter la commande:

npm run test:math

et le "math tests"bloc avec deux tests sera exécuté. Ou bien sûr, vous pouvez spécifier un test particulier par son nom.

Une autre option serait d'extraire le <the-name-of-test-block>paramètre en dehors du "test:math"script et de le passer à partir de la commande NPM:

package.json:

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

Commander:

npm run test:math "math tests"

Vous pouvez maintenant gérer le nom des tests d'exécution avec une commande beaucoup plus courte.

Remarques:

  1. La 'jest'commande fonctionnera avec les scripts NPM car

    npm crée "./node_modules/.bin"la première entrée dans la PATHvariable d'environnement lors de l'exécution de scripts de cycle de vie, donc cela fonctionnera bien, même si votre programme n'est pas installé globalement ( blog NPM )

  2. Cette approche ne semble pas permettre le débogage car Jest est exécuté via son binaire / CLI , pas via node.

Exécution du test Jest sélectionné dans Visual Studio Code

Si vous utilisez Visual Studio Code, vous pouvez en profiter et exécuter le test actuellement sélectionné (dans l'éditeur de code) en appuyant sur le F5bouton. Pour ce faire, nous devrons créer un nouveau bloc de configuration de lancement dans le ".vscode/launch.json"fichier. Dans cette configuration, nous utiliserons des variables prédéfinies qui sont remplacées par les valeurs appropriées (malheureusement pas toujours ) lors de l'exécution. De tous les disponibles, nous ne sommes intéressés que par ceux-ci:

  • ${relativeFile} - le fichier ouvert actuel par rapport à ${workspaceFolder}
  • ${selectedText} - le texte actuellement sélectionné dans le fichier actif

Mais avant d'écrire la configuration de lancement, nous devons ajouter le 'test'script dans notre 'package.json'(si nous ne l'avons pas encore).

package.json:

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

alors nous pouvons l'utiliser dans notre configuration de lancement.

Lancer la configuration:

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

il fait en fait la même chose que les commandes décrites plus haut dans cette réponse. Maintenant que tout est prêt, nous pouvons exécuter n'importe quel test que nous voulons sans avoir à réécrire les paramètres de commande manuellement.

Voici tout ce que vous devez faire:

  1. Sélectionnez la configuration de lancement actuellement créée dans le panneau de débogage:

sélectionnez lancer la configuration dans le panneau de débogage VSCode

  1. Ouvrez le fichier contenant les tests dans l'éditeur de code et sélectionnez le nom du test que vous souhaitez tester (sans les guillemets):

sélectionner le nom du test

  1. Appuyez sur le 'F5'bouton.

Et le tour est joué!

Maintenant, pour exécuter le test que vous souhaitez, ouvrez-le dans l'éditeur, sélectionnez son nom et appuyez sur F5.

Malheureusement, ce ne sera pas "voila" sur les machines Windows car elles substituent (qui sait pourquoi) la ${relativeFile}variable avec le chemin ayant des barres obliques inversées et Jest ne comprendrait pas un tel chemin.

Remarques:

  1. Pour exécuter sous le débogueur, n'oubliez pas d'ajouter le '--inspect-brk'paramètre.
  2. Dans cet exemple de configuration, nous n'avons pas de paramètre de configuration Jest en supposant qu'il est inclus dans 'package.json'.
Sergey
la source
1
Excellent! Ce devrait être la réponse acceptée. Surtout s'il ajoute une mention npxpour simplifier considérablement l'appel de Jest, quel que soit le système d'exploitation.
Dan Dascalescu
19

Vous pouvez également utiliser fou xpour concentrer ou exclure un test. Par exemple

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
la source
1
Vous ne savez pas pourquoi cette réponse a été rejetée, elle semble répondre à la question et fonctionne.
mbillard
1
xita fonctionné pour moi, mais fitne fonctionne pas. j'utilise [email protected].
Hinrich
fittravaille pour [email protected] pour moi.
jcubic
Je pense que le principal inconvénient de cette approche est que - si vous essayez simplement d'explorer un test pour corriger un bogue - cela implique des modifications inutiles des fichiers de test sous-jacents. Si, pour quelque raison que ce soit, vous souhaitez conserver le code de test (entre les validations, par exemple), cela peut avoir un sens.
webelo
fcela ne fonctionne que dans un seul fichier.
Sergey
14

Comme indiqué ci-dessus, vous pouvez exécuter la commande

jest -t 'fix-order-test'

Si vous avez l' itintérieur d'un describebloc, vous devez exécuter

jest -t '<describeString> <itString>'
Wladimir Gramacho
la source
13

Si vous avez jestexécuté en tant que commande de script, quelque chose comme npm test, vous devez utiliser la commande suivante pour le faire fonctionner:

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

avec la dernière version plaisanterie , vous pouvez utiliser l'une des options suivantes pour exécuter un seul test, de même pour la suite de tests.

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

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

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

jest 'test 1' peut également fonctionner si le nom du test est unique.

le code de schrodinger
la source
4

Dans VS Code, cela ne me permet d'exécuter / déboguer qu'un seul test Jest, avec des points d'arrêt: https://github.com/Microsoft/vscode-recipes/tree/master/debugging-jest-tests

Mon launch.jsona ceci à l'intérieur:

{
  "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",
      }
    }
  ]
}

et ceci en package.json:

  "scripts": {
    "test": "jest"
  }
  • Pour exécuter 1 test, dans ce test, remplacez test(ou it) par test.only(ou it.only). Pour exécuter 1 suite de tests (plusieurs tests), passez describeà describe.only.
  • Définissez des points d'arrêt si vous le souhaitez.
  • Dans VS Code, accédez à Debug View (Shift + Cmd + D).
  • Dans le menu déroulant en haut, choisissez Jest Current File.
  • Cliquez sur la flèche verte pour exécuter ce test.
Raymond Gan
la source
Dans mon cas, votre config ne lance qu'un seul test (avec it.only (...)), mais cela ne s'arrête pas aux points d'arrêt :(
Tudor Leustean
Obtenir JavaScript pour atteindre les points d'arrêt dans un débogueur peut être délicat, en raison de sa nature asynchrone. Dans VS Code, jouez avec l'endroit où vous placez vos points d'arrêt, ainsi que les commandes du menu Déboguer, jusqu'à ce qu'il les atteigne. S'il continue de sauter des points d'arrêt, placez-les PLUS TÔT dans votre code. Si 1 fichier appelle une fonction dans un autre fichier, placez un point d'arrêt à cet appel de fonction, puis "Passez à" l'appel pour sauter des fichiers. Jouez avec ces commandes de débogage: "Passez par dessus, entrez, sortez, continuez"
Raymond Gan
En fait, vous n'avez pas besoin "scripts": { "test": "jest" }de package.jsoncar vous avez spécifié le chemin complet dans le "program"paramètre dans launch.json.
Sergey
4

juste un petit add-on, car il semble qu'il y ait eu une sorte de combat pour utiliser ./node_modules/.bin/jest -i ...ou juste jest -i ...ounpm test -- -i ...

  1. appeler simplement jestworks si vous l'avez installé globalement (comme avec npm install -g jest), une façon pas si propre de gérer les dépendances
  2. si jest n'est installé que localement dans le package et que vous souhaitez appeler le script jest sans détour par le script npm, vous pouvez utiliser npx jest -i ...=> c'est exactement à cela que sert npx. vous évite d'écrire./node_modules/.bin/...
Armin Groll
la source
3

Voici mon point de vue:

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

Remarques:

  • ./node_modules/.bin/...est une merveilleuse façon d'accéder au binaire jest (ou mocha ou ...) installé localement fourni avec le paquet installé localement. (oui, dans vos scripts npm, vous ne pouvez jestrien faire auparavant, mais c'est pratique en ligne de commande ... (c'est aussi un bon début pour votre configuration de débogage, quel que soit l'IDE que vous utilisez ...)
  • votre projet peut ne pas avoir un ensemble d'options de configuration. Mais si c'est le cas (jetez un œil aux scripts package.json), c'est ce dont vous avez besoin.
  • --runInBand - comme dit, je ne sais pas pour votre config, mais si vous vous concentrez sur le développement / la correction d'un seul test, vous ne voulez plutôt pas faire affaire avec des travailleurs du web ...
  • oui, vous pouvez donner le chemin complet et explicite de votre fichier
  • facultativement , vous pouvez utiliser -tpour ne pas exécuter tous les tests dans ce fichier mais seulement un seul (ici: celui qui a quelque chose avec ' show expanded' dans son nom). Le même effet peut être obtenu en collant .only()dans ce fichier.
Frank Nocke
la source
0

Il y a maintenant un plugin plaisant pour cela appelé jest-watch-typeaheadcela rend ce processus beaucoup plus simple.

rivanov
la source
0
npm run test -- test-name

Cela ne fonctionnera que si le nom de votre spécification de test est unique. Le code ci-dessus ferait référence

un fichier avec ce nom: test-name.component.spec.ts

tony2tones
la source