最終更新:

VitestとJestの違いは?設定・モック・移行の注意点を比較


JestとVitest:設定と移行を比べるJest既存の設定・presetを活用グローバルAPIは標準で有効jest.fn / jest.mock変換・DOM環境を設定VitestViteの設定・プラグインを利用APIはimportかglobals設定vi.fn / vi.mockモックの動作差を確認速度は同じテスト・実行条件で確認性能の優劣を示すグラフではありません JestとVitest:設定と移行を比べるJest既存の設定・presetを活用グローバルAPIは標準で有効jest.fn / jest.mock変換・DOM環境を設定VitestViteの設定・プラグインを利用APIはimportかglobals設定vi.fn / vi.mockモックの動作差を確認速度は同じテスト・実行条件で確認性能の優劣を示すグラフではありません
速度は同じテスト・実行条件で確認
ひよこ ひよこ
JestからVitestに変えた方がいいの?
ペンギン先生 ペンギン先生
Viteの設定をテストでも共有したいならVitestを検討する価値があるよ。一方、Jestのテストと周辺ツールが安定しているなら、移行の手間に見合う改善があるかを先に確かめよう。
ひよこ ひよこ
VitestはJestの新版なの?
ペンギン先生 ペンギン先生
別のテストフレームワークだよ。VitestはViteを利用し、describe・test・expectなどJestに似たAPIを備えている。ただ、似た書き方ができることと、すべての動作が同じことは別なんだ。
ひよこ ひよこ
ViteとVitestも違うの?
ペンギン先生 ペンギン先生
Viteは開発サーバーやビルドのためのツールで、Vitestはテストを実行して結果を確かめるツール。VitestではViteのプラグインやパスの別名設定を利用できる。アプリ側がViteを使っていなくてもVitestは導入できるよ。
ひよこ ひよこ
TypeScriptなら設定なしで大丈夫?
ペンギン先生 ペンギン先生
VitestはTypeScriptの変換を扱えるけれど、通常のテスト実行だけで型エラーをすべて検査するわけではないよ。型チェックも別に実行しよう。ブラウザーのDOMを使うテストには、jsdomなどの環境やBrowser Modeの設定も必要になるんだ。
ひよこ ひよこ
jestをviに書き換えれば移行できる?
ペンギン先生 ペンギン先生
それだけでは足りないことがあるよ。Vitestは標準ではtestやexpectをグローバルにしないので、importするかglobalsを設定する。モックの初期化・リセット、ファクトリの返り値、セットアップ処理も確認しよう。
ひよこ ひよこ
Vitestの方が必ず速いの?
ペンギン先生 ペンギン先生
テストの内容や設定によるよ。ファイル変更時の再実行と、CIで全件を実行する場面では条件も違う。隔離・並列数・カバレッジをそろえて、自分のテストで比べるのが確実だね。
ひよこ ひよこ
V8のカバレッジは精度が低いって聞いたよ?
ペンギン先生 ペンギン先生
その説明をVitest全般に当てはめるのは古いよ。公式資料では3.2.0以降のV8カバレッジはASTを使って位置を対応づけ、Istanbulと同等のレポート精度を得ると説明している。移行時には対象ファイルや除外条件もそろえて比較しよう。
ひよこ ひよこ
安全に試すにはどうしたらいい?
ペンギン先生 ペンギン先生
単純な関数、DOM、モックを使うテストを少しずつ移し、失敗すべきテストが本当に失敗するかも確認しよう。CIには1回で終了するvitest runを使う。既存Jestをすぐ削除せず、代表的なテストで差を確認してから切り替えると判断しやすいよ。

何を重視して選ぶか

観点JestVitest
設定の出発点Jestの設定・変換・既存presetViteの設定・プラグインを利用可能
テストAPItest、expect、jest.fnなどtest、expect、vi.fnなど。完全互換ではない
グローバルAPI標準で有効標準で無効。importまたは設定が必要
TypeScriptBabel等の変換設定を確認変換を扱えるが、型検査は別に確認
カバレッジbabelまたはv8v8またはistanbul
判断の中心既存テスト・presetとの適合Viteとの共有と移行時の動作差

JestのcoverageProviderの既定値はbabelです。Vitestのカバレッジはプロバイダーに対応する追加パッケージを使用します。「V8だから必ず速い」「Istanbulだけが正確」といった固定的な選び方は避けましょう。

Jestから移すときのチェックリスト

  1. Node.js・Viteの対応版を確認する。 導入するVitestのメジャー版に合う公式ガイドを使います。
  2. APIのimportを明示する。 既存テストが暗黙のグローバルに依存していないかを確認します。
  3. モックの意味を確認する。 mockResetの動作、モジュールのモック、default exportを返す形、タイマーなどを点検します。単純な名前の置換で済むと決めつけません。
  4. DOMと後片付けを確認する。 環境・setupファイル・Testing Libraryのcleanupを確認します。グローバル設定の変更で自動cleanupの前提が変わることがあります。
  5. CIの終了条件を確認する。 vitest runで全件を1回実行し、失敗を非ゼロ終了として検知できることを確かめます。カバレッジの対象・除外・しきい値も引き継ぎます。

最小のテスト例

Vitestが導入済みのプロジェクトで、sum.test.tsに次を置く例です。DOMやアプリ固有の設定は不要な、関数だけのテストです。

import { expect, test } from 'vitest';

const sum = (a: number, b: number) => a + b;

test('2と3を足すと5になる', () => {
  expect(sum(2, 3)).toBe(5);
});

vitest runで成功し、期待値を6に変えれば失敗するのが想定動作です。itはtestの別名なので、この例で入れ替えてもテストの意味は変わりません。型チェックの確認は、プロジェクトのtsc --noEmitなどで別途行います。

移行を急がなくてよいケース

Jest固有のpreset・独自transform・モックに依存するテストが多く、現状の開発速度に問題がなければ、維持する選択も妥当です。Viteを使っているかだけで決めず、設定の共有による利点と互換性確認の費用を比較してください。本記事には、両者の実行速度を同条件で測ったベンチマークは掲載していません。

参考資料

確認日:2026年9月26日。