logo
Published on

NestJS x Vitestの環境構築

Authors

背景

  • Jestはテスティングフレームワークで、歴史もあり圧倒的シェア持っている
  • しかしJest互換のVitestというティンティングフレームが新しく台頭
    • Viteという非常に高速なビルドツールが出現し、そのVite-nativeなテスティングフレームワークで速度が非常に速い
  • テストは記述量も増加する一方になることもあり、「早く終わること」がめっちゃ大事
    • テスト実行時間を減らすことのメリット
      • テスト実行回数の増加 = コードへのバグ混入率低下
      • テスト書くことへの心理的負担の軽減
      • CIでの実行時間削減によるコスト減をしたい

対応結果

ごく少ないテストケースでの実行速度比較です。このくらいのケースでも圧倒的にVitestのほうが実行早かったです。

  • Jest vs. Vitest
    • Vitest
      1. 949ms(Done in 1.31s)
      2. 1.23s(Done in 1.60s)
      3. 1.08s(Done in 1.46s)
      4. 1.10s(Done in 1.48s)
      5. 1.10s(Done in 1.46s)
      6. 1.10s(Done in 1.48s)
      7. 1.06s(Done in 1.43s)
      8. 958mss(Done in 1.33s)
      9. 1.12s(Done in 1.50s)
      10. 990ms(Done in 1.36s)
    • Jest
      1. 6.861s(Done in 8.82s)
      2. 5.005s(Done in 5.87s)
      3. 4.793s(Done in 5.37s)
      4. 4.674(Done in 5.33s)
      5. 4.658s(Done in 5.33s)
      6. 5.377s(Done in 6.19s)
      7. 4.873s(Done in 5.59s)
      8. 4.992s(Done in 5.66s)
      9. 4.776s(Done in 5.44s)
      10. 4.667s(Done in 5.36s)

参照

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のメソッドに書き換えたのみでほぼ対応完了