メインコンテンツへスキップ
バージョン: 29.7

トラブルシューティング

非公式ベータ版翻訳

このページは PageTurner AI で翻訳されました(ベータ版)。プロジェクト公式の承認はありません。 エラーを見つけましたか? 問題を報告 →

問題が発生しましたか?このガイドで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を開き「Open Dedicated DevTools for Node」をクリックします。接続可能なNodeインスタンスの一覧が表示されるので、上記コマンド実行後にターミナルに表示されたアドレス(通常localhost:9229など)をクリックすると、ChromeのDevToolsでJestをデバッグできます。

Chromeデベロッパーツールが表示され、Jest CLIスクリプトの最初の行にブレークポイントが設定されます(これは開発者ツールを開く時間を確保し、準備が整う前にJestが実行されるのを防ぐためです)。画面右上の「再生」ボタンをクリックして実行を再開してください。debuggerステートメントを含むテストが実行されると処理が一時停止し、現在のスコープやコールスタックを調査できます。

メモ

--runInBandオプションは、Jestがテストを個別のプロセスでなく同一プロセスで実行するよう強制します。通常Jestはテストを並列実行しますが、複数プロセスの同時デバッグは困難です。

VS Codeでのデバッグ

Visual Studio Codeの組み込みデバッガでJestテストをデバッグする方法は複数あります。

組み込みデバッガをアタッチするには、前述の方法でテストを実行します:

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

Nodeデバッグの詳細はこちらで確認できます。

WebStormでのデバッグ

WebStormはJestをネイティブサポートしています。詳細はWebStormでのJestテストをご覧ください。

キャッシュ関連の問題

トランスフォームスクリプトを変更した、あるいはBabelをアップデートしたのに、Jestが変更を認識しない?

--no-cacheオプションで再実行してください。Jestはテスト実行を高速化するため変換済みモジュールをキャッシュします。カスタムトランスフォーマーを使用する場合は、getCacheKey関数の追加を検討してください:RelayのgetCacheKey実装例

Promiseが解決しない問題

Promiseが全く解決しない場合、次のエラーが発生する可能性があります:

- 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オプション付きで実行するか、設定オプションのwatchmanfalseに設定してみてください。

また、watchmanのトラブルシューティングも参照してください。

DockerおよびCIサーバー上でのテストが極端に遅い場合

Jestは高速なSSDを搭載したマルチコア環境では非常に高速ですが、特定の設定では遅くなる可能性がユーザーから報告されています(詳細)

調査結果に基づくと、テストを順次実行することで最大50%の速度改善が見込めます。

これを行うには--runInBandオプションを使用して同一スレッドでテストを実行します:

# Using Jest CLI
jest --runInBand

# Using your package manager's `test` script (e.g. with create-react-app)
npm test -- --runInBand

Travis-CIなどのCIサーバーでテスト時間を短縮する別の方法は、最大ワーカープールを約4に設定することです。特にTravis-CIではテスト時間が半減します。注意:オープンソースプロジェクト向けTravis CI無料プランではCPUコアが2つに制限されます。

# Using Jest CLI
jest --maxWorkers=4

# Using your package manager's `test` script (e.g. with create-react-app)
npm 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をラップしており、カバレッジ収集対象ファイルを制御しますが、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内で非同期にテーブルを設定することはできません。

まだ解決しない場合

ヘルプを参照してください。