CIでVitestの実行が止まってしまうときは
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgS461kEQaGe2GPmMtKWisUl2GNgoEuRE1-sEzYeO0HmgYi2hdJ8vDeQE5Y7YGwLSt8NwT0ysdBD1aTB1HIDXMiga1haaSjAwSaGHoYGvX9rK8MNyMmm5g08XuOj_pb2tzbh_C9LIHoc6o/s550/train_4retsu_jousya.png
CI/CD環境など、リソースが極端に制限されている環境で実行している Vitest がフリーズして処理が終わらなくなってしまう場合は以下のいずれかを試すと良い
利用している pool に対応する poolOption.XXXs.singleXXX: true を設定する
Vitestはデフォルトでプロセスやスレッドを駆使して、テストを並列実行しようとする。リソースが限られた環境では、自動で算出された並列度でテストが実行されると、テストランナーがフリーズしてしまうことがある。通常は問題なくても Storybook と Playwright を組み合わせて Chromium などの HeadlessBrowser をつかってUIテストを実行しようとしたりすると顕在化する場合がある。
pool を指定していない場合は Vitest 2.x 以降はデフォルトで fork が設定されている。特段 pool 設定を変えない場合は poolOption.forks.singleFork: true を指定すると良い
ref: https://vitest.dev/guide/cli-generated.html#pooloptions-forks-singlefork
この設定を有効にするとテストケースが直列に実行されるが、Vitest の isolate が無効化されテストケースごとの環境が分離されなくなる。そのためグローバルを変更するようなテストケースが含まれていると別のテストケースに副作用が起こるためテストケースの修正が必要になる場合がある。
設定を変更する前と後でテストの実行に影響がないかなんどか試験走行して見ると良い
code:vitest.workspace.ts
// 例: Storybook連携しているVitestでStorybookのテストケースだけ調整する
export default defineWorkspace([
"vite.config.ts",
{
plugins: [
storybookTest(),
],
test: {
name: "storybook",
pool: "forks", // Vitestの更新で変化しないようデフォルト値を明示
poolOptions: {
forks: {
singleFork: true, // pool:fork なので singleFork を有効にする
},
},
browser: {
enabled: true,
headless: true,
name: "chromium",
provider: "playwright",
},
setupFiles: "./.storybook/vitest.setup.ts",
include: ["src/**/*.stories.?(m)jts?(x)"],
exclude: "src/public",
},
},
]);
環境のCPUやメモリ割り当てを増やす
リソースに余裕がある、もしくは金銭的に余裕がある場合は単純に実行環境のリソースを増やすことでも対処できる。力こそパワー。
JestのrunInBandとの違い
Jest にもリソースが制限された環境などを想定して、テストを直列に実行する設定 runInBand がある。
ref: https://jestjs.io/ja/docs/cli#--runinband
Jestではこの runInBand を有効にしても isolate (環境の分離) が有効なままだが、Vitest では内部実装の都合で isolate もセットで無効になってしまう点に注意。
関連
JestとVitestのisolateについて