Устранение неполадок
Что-то пошло не так? Воспользуйтесь этим руководством, чтобы устранить проблемы с Jest.
Тесты не проходят, и вы не знаете почему
Попробуйте воспользоваться встроенной в Node поддержкой отладки. Добавьте оператор debugger; в любой тест, а затем в каталоге проекта выполните:
node --inspect-brk node_modules/.bin/jest --runInBand [any other arguments here] or on Windows node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand [any other arguments here]
Эта команда запустит Jest в процессе Node, к которому сможет подключиться внешний отладчик. Обратите внимание, что процесс будет приостановлен до подключения отладчика.
Чтобы выполнять отладку в Google Chrome (или любом браузере на основе Chromium), откройте браузер, перейдите по адресу chrome://inspect и нажмите «Open Dedicated DevTools for Node». Откроется список доступных экземпляров Node, к которым можно подключиться. После выполнения приведённой выше команды нажмите адрес, отображённый в терминале (обычно он выглядит примерно так: localhost:9229), и вы сможете отлаживать Jest с помощью Chrome DevTools.
Откроются Chrome Developer Tools, а на первой строке скрипта Jest CLI будет установлена точка останова (это даёт вам время открыть инструменты разработчика и не позволяет Jest начать выполнение раньше). Нажмите кнопку, похожую на кнопку «Воспроизведение», в верхней правой части экрана, чтобы продолжить выполнение. Когда Jest запустит тест, содержащий оператор debugger, выполнение приостановится, и вы сможете изучить текущую область видимости и стек вызовов.
Параметр CLI --runInBand гарантирует, что Jest запустит тест в том же процессе, а не будет порождать отдельные процессы для каждого теста. Обычно Jest выполняет тесты параллельно в нескольких процессах, но отлаживать множество процессов одновременно сложно.
Отладка в VS Code
Существует несколько способов отладки тестов Jest с помощью встроенного отладчика Visual Studio Code.
Чтобы подключить встроенный отладчик, запустите тесты, как описано выше:
node --inspect-brk node_modules/.bin/jest --runInBand [any other arguments here] or on Windows node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand [any other arguments here]
Затем подключите отладчик VS Code с помощью следующей конфигурации launch.json:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "attach",
"name": "Attach",
"port": 9229
}
]
}
Чтобы автоматически запустить процесс с тестами и подключиться к нему, используйте следующую конфигурацию:
{
"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"
}
]
}
или следующую конфигурацию для 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"
}
]
}
Если вы используете create-react-app от Facebook, вы можете отлаживать тесты Jest с помощью следующей конфигурации:
{
"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"
}
]
}
Дополнительную информацию об отладке Node можно найти здесь.
Отладка в WebStorm
WebStorm имеет встроенную поддержку Jest. Подробнее см. в статье «Тестирование с Jest в WebStorm».
Проблемы с кэшированием
Вы изменили скрипт преобразования или обновили Babel, но Jest не распознаёт изменения?
Повторите запуск с параметром --no-cache. Jest кэширует преобразованные файлы модулей, чтобы ускорить выполнение тестов. Если вы используете собственный преобразователь, добавьте в него функцию getCacheKey: getCacheKey в Relay.
Неразрешённые промисы
Если промис вообще не разрешается, может возникнуть такая ошибка:
- Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
Чаще всего это происходит из-за конфликтующих реализаций Promise. Попробуйте заменить глобальную реализацию Promise собственной, например globalThis.Promise = jest.requireActual('promise');, и/или объединить используемые библиотеки Promise в одну.
Если выполнение теста занимает много времени, можно увеличить тайм-аут, вызвав jest.setTimeout
jest.setTimeout(10_000); // 10 second timeout
Проблемы с Watchman
Попробуйте запустить Jest с параметром --no-watchman или задайте для параметра конфигурации watchman значение false.
Также см. устранение неполадок Watchman.
Тесты выполняются очень медленно в Docker и/или на сервере непрерывной интеграции (CI).
Хотя на современных многоядерных компьютерах с быстрыми SSD Jest обычно работает очень быстро, в некоторых конфигурациях он может быть медленным, как обнаружили пользователи.
Согласно результатам, один из способов смягчить эту проблему и повысить скорость до 50% — запускать тесты последовательно.
Для этого можно выполнять тесты в одном потоке с помощью параметра --runInBand:
- npm
- Yarn
- pnpm
- Bun
# 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
# Using Jest CLI jest --runInBand # Using your package manager's `test` script (e.g. with create-react-app) bun run test --runInBand
Ещё один способ ускорить выполнение тестов на серверах непрерывной интеграции, таких как Travis-CI, — задать максимальный размер пула рабочих процессов примерно равным 4. В частности, на Travis-CI это может вдвое сократить время выполнения тестов. Примечание: бесплатный тариф Travis CI для проектов с открытым исходным кодом включает только 2 ядра ЦП.
- npm
- Yarn
- pnpm
- Bun
# 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
# Using Jest CLI jest --maxWorkers=4 # Using your package manager's `test` script (e.g. with create-react-app) bun run test --maxWorkers 4
Если вы используете GitHub Actions, можно воспользоваться github-actions-cpu-cores, чтобы определить количество ЦП и передать это значение Jest.
- name: Get number of CPU cores
id: cpu-cores
uses: SimenB/github-actions-cpu-cores@v2
- name: run tests
run: yarn jest --max-workers ${{ steps.cpu-cores.outputs.count }}
Ещё можно использовать флаг shard, чтобы распределить выполнение тестов между несколькими компьютерами.
Похоже, coveragePathIgnorePatterns не оказывает никакого эффекта.
Убедитесь, что вы не используете плагин babel-plugin-istanbul. Jest оборачивает Istanbul и поэтому также указывает Istanbul, какие файлы следует обработать для сбора покрытия. При использовании babel-plugin-istanbul в каждый файл, обрабатываемый Babel, добавляется код для сбора покрытия, поэтому он не игнорируется параметром coveragePathIgnorePatterns.
Определение тестов
Тесты необходимо определять синхронно, чтобы Jest мог их обнаружить.
Чтобы понять причину, рассмотрим такой пример теста:
// Don't do this it will not work
setTimeout(() => {
it('passes', () => expect(1).toBe(1));
}, 0);
Когда Jest запускает тест для сбора test, он не найдёт ни одного, потому что определение отложено асинхронно до следующего такта цикла событий. Это означает, что при использовании test.each нельзя задавать таблицу асинхронно внутри beforeEach / beforeAll.
Проблема всё ещё не решена?
См. раздел «Помощь».
© 2022 Facebook, Inc.
Licensed under the MIT License.
https://jestjs.io/docs/troubleshooting