Dépannage
Oh oh, quelque chose s'est mal passé ? Utilisez ce guide pour résoudre les problèmes avec Jest.
Les tests échouent et vous ne savez pourquoi
Try using the debugging support built into Node. Placez l'instruction debugger;
dans l’un de vos tests et puis, dans le répertoire de votre projet, exécutez :
node --inspect-brk node_modules/.bin/jest --runInBand [tout autre argument ici]
ou sous Windows
node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand [tout autre argument ici]
Cela exécutera Jest dans un processus de Node auquel un débogueur externe peut se connecter. Notez que le processus sera mis en pause jusqu'à ce que le débogueur s'y soit connecté.
Pour déboguer dans Google Chrome (ou n'importe quel navigateur basé sur Chromium), ouvrez votre navigateur et allez dans chrome://inspect
et cliquez sur « Open Dedicated DevTools for Node », qui vous donnera une liste d'instances de node disponibles auxquelles vous pouvez vous connecter. Cliquez sur l'adresse affichée dans le terminal (généralement quelque chose comme localhost:9229
) après avoir exécuté la commande ci-dessus, et vous serez en mesure de déboguer Jest en utilisant DevTools de Chrome.
Les outils de développement Chrome seront affichés, et un point d'arrêt sera défini à la première ligne du script CLI de Jest (ceci est fait pour vous donner le temps d'ouvrir les outils de développement et pour empêcher Jest de s'exécuter avant que vous ayez le temps de le faire). Cliquez sur le bouton qui ressemble à un bouton « play » en haut à droite de l'écran pour continuer l'exécution. Lorsque Jest exécute le test qui contient l'instruction debugger
, l'exécution se met en pause et vous pouvez examiner la portée actuelle et la pile d'appels.
The --runInBand
cli option makes sure Jest runs the test in the same process rather than spawning processes for individual tests. Normalement, Jest parallélise les tests à travers les processus, mais il est difficile de déboguer plusieurs processus en même temps.
Débogage dans VS Code
Il y a plusieurs façons de déboguer les tests Jest avec le débogueur intégré de Visual Studio Code.
Pour attacher le débogueur intégré, exécutez vos tests comme mentionné précédemment :
node --inspect-brk node_modules/.bin/jest --runInBand [tout autre argument ici]
ou sous Windows
node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand [tout autre argument ici]
Rattachez ensuite le débogueur de VS Code en utilisant la configuration launch.json
suivante :
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "attach",
"name": "Attach",
"port": 9229
}
]
}
Pour lancer et rattacher automatiquement un processus exécutant vos tests, utilisez la configuration suivante :
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Jest Tests",
"type": "node",
"request": "launch",
"runtimeArgs": [
"--inspect-brk",
"${workspaceRoot}/node_modules/.bin/jest",
"--runInBand"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]
}
ou ce qui suit pour Windows :
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Jest Tests",
"type": "node",
"request": "launch",
"runtimeArgs": [
"--inspect-brk",
"${workspaceRoot}/node_modules/jest/bin/jest.js",
"--runInBand"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]
}
Si vous utilisez l'application create-react-app
de Facebook, vous pouvez déboguer vos tests Jest avec la configuration suivante :
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug CRA Tests",
"type": "node",
"request": "launch",
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/react-scripts",
"args": [
"test",
"--runInBand",
"--no-cache",
"--env=jsdom",
"--watchAll=false"
],
"cwd": "${workspaceRoot}",
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen"
}
]
}
Plus d'informations sur le débogage de Node peuvent être trouvées ici.
Débogage dans WebStorm
WebStorm a un support intégré pour Jest. Lisez Tester avec Jest dans WebStorm pour en savoir plus.
Problèmes de Cache
Le script de transformation a été modifié ou Babel a été mis à jour et les changements ne sont pas reconnus par Jest ?
Réessayez avec --no-cache
. Jest met en cache les fichiers de modules transformés pour accélérer l'exécution des tests. Si vous utilisez votre propre transformateur personnalisé, pensez à ajouter une fonction getCacheKey
à celle-ci : getCacheKey dans Relay.
Promesses non résolues
Si une promesse n'est pas résolue du tout, cette erreur peut être levée :
- Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.`
Le plus souvent, ce problème est causé par des implémentations conflictuelles de promesses. Envisagez de remplacer l'implémentation de la promesse globale par la vôtre, par exemple globalThis.Promise = jest.requireActual('promise');
et/ou consolidez les bibliothèques de promesses utilisées en une seule.
Si votre test s'exécute de manière prolongée, vous pouvez envisager d'augmenter le délai d'attente en appelant jest.setTimeout
jest.setTimeout(10000); // timeout de 10 secondes
Problèmes de Watchman
Essayez d'exécuter Jest avec --no-watchman
ou définissez l'option de configuration watchman
à false
.
Consulter aussi dépannage de watchman.
Les tests sont extrêmement lents sur le serveur Docker et/ou l'intégration continue (CI).
While Jest is most of the time extremely fast on modern multi-core computers with fast SSDs, it may be slow on certain setups as our users have discovered.
Based on the findings, one way to mitigate this issue and improve the speed by up to 50% is to run tests sequentially.
Pour ce faire, vous pouvez exécuter les tests dans le même processus en utilisant --runInBand
:
- npm
- Yarn
- pnpm
# Using Jest CLI
jest --runInBand
# Using your package manager's `test` script (e.g. with create-react-app)
npm test -- --runInBand
# Using Jest CLI
jest --runInBand
# Using your package manager's `test` script (e.g. with create-react-app)
yarn test --runInBand
# Using Jest CLI
jest --runInBand
# Using your package manager's `test` script (e.g. with create-react-app)
pnpm test -- --runInBand
Une autre alternative pour accélérer le temps d'exécution des tests sur les serveurs d'intégration continue tels que Travis-CI est de définir le nombre maximal de workers à ~4. En particulier sur Travis-CI, cela peut réduire de moitié le temps d'exécution des tests. Remarque : le forfait gratuit de Travis CI disponible pour les projets open source ne comprend que 2 cœurs de processeur.
- npm
- Yarn
- pnpm
# Using Jest CLI
jest --maxWorkers=4
# Using your package manager's `test` script (e.g. with create-react-app)
npm test -- --maxWorkers=4
# Using Jest CLI
jest --maxWorkers=4
# Using your package manager's `test` script (e.g. with create-react-app)
yarn test --maxWorkers=4
# Using Jest CLI
jest --maxWorkers=4
# Using your package manager's `test` script (e.g. with create-react-app)
pnpm test -- --maxWorkers=4
Si vous utilisez des actions GitHub, vous pouvez utiliser github-actions-cpu-cores
pour détecter le nombre de processeurs, et le passer à Jest.
- name: Get number of CPU cores
id: cpu-cores
uses: SimenB/github-actions-cpu-cores@v1
- name: run tests
run: yarn jest --max-workers ${{ steps.cpu-cores.outputs.count }}
Une autre chose que vous pouvez faire est d'utiliser l'option shard
pour paralléliser l'exécution de test sur plusieurs machines.
coveragePathIgnorePatterns
ne semble avoir aucun effet.
Assurez-vous que vous n'utilisez pas le plugin babel-plugin-istanbul
. Jest enveloppe Istanbul, et indique donc également à Istanbul quels fichiers doivent être traités avec la collection de couverture. Lors de l'utilisation de babel-plugin-istanbul
, chaque fichier qui est traité par Babel aura un code de collecte de couverture, donc il ne sera pas ignoré par coveragePathIgnorePatterns
.
Définition des tests
Les tests doivent être définis de manière synchronisée pour que Jest puisse collecter vos tests.
Comme exemple pour montrer pourquoi c'est le cas, imaginez que nous avons écrit un tel test :
// Ne le faites pas, cela ne fonctionnera pas
setTimeout(() => {
it('passes', () => expect(1).toBe(1));
}, 0);
Lorsque Jest exécute votre test pour collecter les test
s, il n'en trouvera aucun car nous avons configuré la définition pour qu'elle se produise de manière asynchrone au prochain déclenchement de la boucle d'événement. This means when you are using test.each
you cannot set the table asynchronously within a beforeEach
/ beforeAll
.
Toujours pas de solution ?
Consultez l'aide.