トラブルシューティング
何かがうまくいかない場合は、このガイドを使用して 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]
これにより、外部デバッガーが接続できる Node プロセスで Jest が実行されます。デバッガーが接続されるまでプロセスは一時停止することに注意してください。
Google Chrome(または Chromium ベースの任意のブラウザ)でデバッグするには、ブラウザを開いて chrome://inspect
に移動し、「Node 用の専用 DevTools を開く」をクリックします。これにより、接続できる使用可能なノードインスタンスのリストが表示されます。上記のコマンドを実行した後にターミナルに表示されるアドレス(通常は localhost:9229
のようなもの)をクリックすると、Chrome の DevTools を使用して Jest をデバッグできます。
Chrome Developer Tools が表示され、Jest CLI スクリプトの先頭行にブレークポイントが設定されます(これはデベロッパーツールを開く時間があり、それを行う時間がない前に Jest が実行されないようにするためです)。画面の右上にある「再生」ボタンのようなボタンをクリックして、実行を続行します。Jest が debugger
ステートメントを含むテストを実行すると、実行が一時停止し、現在のスコープとコールスタックを調べることができます。
--runInBand
cli-オプションは、個々のテストにプロセスを生成するのではなく、同じプロセスでテストを実行することを確認します。通常、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]
次に、次の`launch.json`構成を使用してVS Codeのデバッガーをアタッチします
{
"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"
}
]
}
Facebookのcreate-react-app
を使用している場合は、次の構成で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"
}
]
}
ノードのデバッグに関する詳細情報はこちらにありますこちら。
WebStormでデバッグする
WebStormには、Jestのサポートが組み込まれています。WebStormでのJestによるテストをお読みください詳細については、こちらを参照してください。
キャッシュの問題
変形スクリプトが変更されたか、またはBabelがアップデートされて、変更がJestによって認識されないのでしょうか?
で再試行してください--no-cache
。 Jestは変換されたモジュールファイルをキャッシュしてテストの実行を高速化します。独自のカスタム変換を使用している場合は、それに`getCacheKey`関数を追加することを検討してください:RelayでのgetCacheKey。
未解決の約束
プロミスがまったく解決されない場合、このエラーが発生する可能性があります
- Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.`
ほとんどの場合、これはプロミスの実装の競合が原因で発生します。たとえば、グローバルプロミスの実装を独自のもの(globalThis.Promise = jest.requireActual('promise');
)に置き換えたり、使用するPromiseライブラリを1つに統合したりすることを検討してください。
テストに時間がかかる場合は、`jest.setTimeout`を呼び出すことでタイムアウトを増やすことを検討してください
jest.setTimeout(10_000); // 10 second timeout
Watchmanの問題
でJestを実行してみてください:--no-watchman
または`watchman`構成オプションを`false`に設定します。
こちらもご覧ください:watchmanのトラブルシューティング。
Dockerや継続的インテグレーション(CI)サーバー上でテストが非常に遅い。
Jestは通常、高速SSD搭載の近代的なマルチコアコンピュータでは非常に高速ですが、特定のセットアップでは一部のユーザーが発見したように、遅くなる場合があります。
調査に基づいて、この問題を緩和し速度を50%向上させる方法の1つは、テストを順番に実行することです。
これを行うには、--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
Travis-CIなどの継続的インテグレーションサーバでテストの実行時間を高速化するためのもう1つの方法は、最大ワーカプールを~4に設定することです。特にTravis-CIでは、これによりテストの実行時間を半分に短縮できます。注意: オープンソースプロジェクトで利用可能なTravis CIの無料プランにはCPUコアが2つしか含まれません。
- 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
GitHub Actionsを使用している場合は、github-actions-cpu-cores
を使用してCPUの数を検出し、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
内でテーブルを非同期的に設定することはできません。
まだ解決していませんか?
ヘルプを参照してください。