- Published on
NestJS x Vitestの環境構築
- Authors
- Name
- ryyta
- @fubar1346
背景
- Jestはテスティングフレームワークで、歴史もあり圧倒的シェア持っている
- しかしJest互換のVitestというティンティングフレームが新しく台頭
- Viteという非常に高速なビルドツールが出現し、そのVite-nativeなテスティングフレームワークで速度が非常に速い
- テストは記述量も増加する一方になることもあり、「早く終わること」がめっちゃ大事
- テスト実行時間を減らすことのメリット
- テスト実行回数の増加 = コードへのバグ混入率低下
- テスト書くことへの心理的負担の軽減
- CIでの実行時間削減によるコスト減をしたい
- テスト実行時間を減らすことのメリット
対応結果
ごく少ないテストケースでの実行速度比較です。このくらいのケースでも圧倒的にVitestのほうが実行早かったです。
- Jest vs. Vitest
- Vitest
- 949ms(Done in 1.31s)
- 1.23s(Done in 1.60s)
- 1.08s(Done in 1.46s)
- 1.10s(Done in 1.48s)
- 1.10s(Done in 1.46s)
- 1.10s(Done in 1.48s)
- 1.06s(Done in 1.43s)
- 958mss(Done in 1.33s)
- 1.12s(Done in 1.50s)
- 990ms(Done in 1.36s)
- Jest
- 6.861s(Done in 8.82s)
- 5.005s(Done in 5.87s)
- 4.793s(Done in 5.37s)
- 4.674(Done in 5.33s)
- 4.658s(Done in 5.33s)
- 5.377s(Done in 6.19s)
- 4.873s(Done in 5.59s)
- 4.992s(Done in 5.66s)
- 4.776s(Done in 5.44s)
- 4.667s(Done in 5.36s)
- Vitest
参照
Documentation | NestJS - A progressive Node.js framework
Cannot find module 'rollup/parseAst' after vite 5 got released · Issue #4567 · vitest-dev/vitest
対応
1. Vitestの導入とJestの削除
ライブラリのインストール
yarn add --dev vitest @vitest/coverage-v8
vitest.config.ts
の設定import { defineConfig } from 'vitest/config' export default defineConfig({ test: { globals: true, root: './', include: [] // テスト対象の設定 } })
以下のエラーが発生
node_modules/vite/dist/node/index.d.ts:6:41 - error TS2307: Cannot find module 'rollup/parseAst' or its corresponding type declarations. export { parseAst, parseAstAsync } from 'rollup/parseAst'; ~~~~~~~~~~~~~~~~~ Found 1 error in node_modules/vite/dist/node/index.d.ts:6 error Command failed with exit code 2. info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
上記エラーについて、以下Issueがあったので参考に対応
Cannot find module 'rollup/parseAst' after vite 5 got released · Issue #4567 · vitest-dev/vitest
- 原因は
esm/csm
周りの設定のようですが、既存設定大幅に変えるのも他影響ありそうだったり難しかった部分もあったので上記参考にtsconfig.json
に下記追加し対応
{ "compilerOptions": { "paths": { "rollup/parseAst": ["./node_modules/rollup/dist/parseAst.js"], } } }
- 原因は
Jest系ライブラリのアンインストール
- vitestの設定が終わってJest不要になったのでアンインストール
2. 既存テスト分のjest実装をvitest実装に変更
Vitest has been designed with a Jest compatible API, in order to make the migration from Jest as simple as possible.
上記のVitestのサイトから引用したように、JestとVitestでは互換性あるので大半はすんなり移行できる。今回は対してテスト実装がそもそもなかったので特段問題なく、jestに互換性のあるvitestのメソッドに書き換えたのみでほぼ対応完了