【NestJS】複数のテストファイルを実行するとテストが失敗するようになった場合の対策


概要

ある日、複数のテストファイルを実行していると意図しない挙動が発生してテストが失敗するようになった

今回はその改善方法をまとめる。

jest --watch --config ./src/test/e2e/jest-e2e.json
 RUNS  src/test/e2e/contractors.e2e.spec.ts
 RUNS  src/test/e2e/contractors.e2e.spec.ts
 FAIL  src/test/e2e/execBackup.e2e.spec.ts (27.724 s)
 RUNS  src/test/e2e/contractors.e2e.spec.ts

QueryFailedError: Table 'agency_widgets' already exists

原因

Jestでは、パフォーマンスのために複数のテストファイルが並行に処理(テスト)されます。しかし、並行処理が思わぬエラーを生むこともあります。
たとえば、データベースへ接続するテストやpuppeteerを使ったE2Eテストなど副作用を生じさせるテストの場合、テストの書き方や実行タイミングによってはテストが失敗したり、想定しないテスト挙動の原因になります。

前提

テストコードの書き方は以下を参照ください

解決方法

# 現在のプロセスで全てのテストを1つずつ実行
--runInBand

# 全テストが終了した後にJestを強制的に終了
--forceExit 

# Jest が何も出力せずに終了するのを防ぐ
--detectOpenHandles

複数のテストファイルが1つずつ順番に処理されます。具体的にはテスト実行用ワーカーの子プロセスを生成せず、元のプロセス上で順次テストファイルを処理していきます。

jest --runInBand --forceExit --detectOpenHandles