本文へ移動
技術を、自社の仕事に。
判断と実行を助けるメディア

記事を検索

Vitest 5.1の差分テスト実行 試して分かった取りこぼし

目次 · 6項目

AIコーディングエージェントにテストを任せると、1回の修正ごとに全テストを流すのか、関係するものだけにするのかで、大きなプロジェクトでは待ち時間に差が出ます。Vitestには以前から、Gitの差分で対象を絞る --changed がありました。ただ、エージェントが途中でコミットすると差分が空になる、Gitのない作業ディレクトリでは使えない、という弱点があります。

2026年11月2日に公開されたVitest 5.1は、この用途向けに --since-last-run を加えました。本記事では、公式のリリース記事とガイドを確認したうえで、編集部の作業環境(コンテナ)でVitest 5.1.0を実際に動かし、どのテストが選ばれ、どこで取りこぼすかを確かめた結果を整理します。

--since-last-run の仕組み

公式のリリース記事とガイド「Running Only Affected Tests」によると、動きは次のとおりです。

  • 初回はすべてのテストを実行する。 その際、各テストが読み込んだファイル(動的なimport、モック、セットアップファイル、スナップショットを含む)を記録する
  • 2回目以降は更新日時を比べる。 記録したファイルのどれかが前回の実行より新しいか、削除されていれば、そのテストを実行する。記録のないテスト(新しいテストファイルや、ブラウザモード・型チェックで動いたファイル)は毎回実行される
  • 失敗したテストは通るまで毎回実行する。 修正が記録外のファイルにあっても、失敗したテストファイルは再実行される
  • Gitを使わない。 新しいコンテナ、一時的なworktree、リポジトリでないディレクトリでも同じように動く
  • 記録はキャッシュに置かれる。 vitest run --clearCache で消すと、次の実行は再び全件になる。キャッシュを無効にしているとエラーになる

リリース記事ではこの機能を「experimental(実験的)」としています。

実際に動かして確かめたこと

2026年11月6日に、Ubuntu 24.04のコンテナ上のNode.js 22.23.4で、Vitest 5.1.0を入れた小さなプロジェクトを作りました。消費税を計算する src/price.js と、日付を扱う src/date.js に、それぞれテストを1つずつ用意しています。結果は次のとおりです。

操作実行されたテスト表示
1回目(記録なし)2件中2件Affected 2 of 2
何も変えずに2回目0件No changed files found, exiting with code 0
price.js に誤りを入れるprice のテストだけ(失敗)Affected 1 of 2
何も変えずにもう一度price のテスト(失敗)0 changed files, 1 previously failed
price.js を直すprice のテスト(成功)1 changed file, 1 previously failed
fsで読むJSONの値を変える0件No changed files found, exiting with code 0

最後の行が、今回いちばん注意したい結果です。テストの中で readFileSync を使って fixtures/rate.json を読み、値を確かめるテストを追加しました。JSONの値を変えて、そのテストが失敗する状態にしても、--since-last-run は「変更なし」と判断して1件も実行せず、終了コード0で終わりました。同じ状態で vitest run(全件)を実行すると、このテストは失敗します。

記録ファイル(node_modules/.vite/vitest/ の下の dependencies.json)を見ると、このテストの依存として記録されていたのはテストファイル自身だけでした。設定リファレンスの experimental.recordDependencies の項も、Vitestが記録するのは自分で読み込んだファイルだけで、fs で読むファイル(フィクスチャなど)は記録しないと明記しています。

Vitest 5.1の--since-last-runの検証結果の図。importで読んだsrc/price.jsを変えると、そのテストだけが選ばれた。fsのreadFileSyncで読んだfixtures/rate.jsonを変えると、テストが失敗する状態でも「No changed files found」で終了コード0になった。全件のvitest runではこのテストが失敗した。見出しの下に、Vitest 5.1.0、Node.js 22.23.4、2026年11月6日に編集部で確認、と添える

公式のガイドも、記録では見えないものとして「前回の実行でどのテストも読み込まなかったファイル(新しい .env や __mocks__ のファイル)」と「チェックアウトや展開で過去の日時が付いたファイル」を挙げ、最後に全件を実行すれば両方を補えると書いています。今回の結果は、これらの説明と一致します。

エージェントの指示にどう書くか

公式のリリース記事は、エージェント向けの指示ファイル(AGENTS.md)に次の2行を書く例を示しています。

- After a change, run `vitest run --since-last-run` to test only what the change affects.
- Before you finish, run `vitest run` once for the whole suite.

1行目だけを書くと、上の検証のように、fs で読むJSONなどのデータを変えた修正でテストが1件も動かず、「成功」と受け取られるおそれがあります。2行目の「終わる前に全件を1回流す」は省かないほうが安全です。なお、設定リファレンスによると、Vitest自身の設定ファイルとそのimport、グローバルセットアップ、.env のファイルを変えた場合は、プロジェクトのテストがすべて実行されます(この点は今回試していません)。

あわせて、次の使い分けも意識しておくとよいでしょう(編集部の提案)。

  • CIでは使わない。 CIは「誰が実行しても同じ結果」であることが大事です。公式のガイドも、基準を他の人と共有するなら --changed が向くとし、プルリクエストの確認には --changed origin/main を挙げています。キャッシュを持ち越すCIで --since-last-run を使うと、前回の記録しだいで実行件数が0になりえます
  • テスト用のデータは import で読む作りも検討する。 公式の説明では、importしたモジュールは記録の対象です。JSONを import で読めば、記録の対象になると考えられます(この点は今回試していません)

公式リポジトリには、5.1.0についての利用者の報告で、未解決のものもあります(2026年11月6日時点。どちらも今回は試していません)。#11863 は、import.meta.hot を読むモジュールをDOM環境で読み込むテストが、変更がなくても毎回再実行されるという報告で、Vueのコンポーネントのテストが例に挙がっています。#11864 は、vitest run --since-last-run <ファイル> のファイルの指定が無視されるという報告です。

AIエージェントにテストの結果を読ませる工夫は、Vitest 4.1のAI Agent Reporterの記事でも扱いました。

--last-failed と、気づきにくいほかの変更

--last-failed は、前回の実行で失敗したテストだけを実行するフラグです。上の検証で price.js に誤りを入れたあとに実行すると、「Last Failed 1 of 2 test files」と表示され、失敗した1件だけが動きました。テスト名で選ぶため、ほかのテストを追加・移動しても選ばれる対象は変わらない、とリリース記事は説明しています。CLIのリファレンスによると、名前を変えたテストはフラグなしで実行するまで選ばれず、前回の失敗がないときは No failed tests found と表示して終了コード1で終わります(--passWithNoTests を付けない場合)。

ブラウザモードを使っているプロジェクトでは、次の変更にも注意が要ります。

  • 既定のポートが 63315 から 23315 に変わった。 Hyper-V、WSL2、Docker Desktopが動くWindowsで古いポートが予約され、起動できないことがあったためです。ファイアウォールやコンテナの設定で古いポートを前提にしている場合は、api.port を指定します
  • モックの仕組みがimport mapに変わった(実験的、browser.importMapMocks)。 対応するブラウザ(Chromium 133以降、Safari 18.4以降、PlaywrightのプロバイダーでのFirefox 150以降)では、vi.mock で登録する前にそのモジュールが読み込まれていた場合、黙って元のモジュールを使うのではなくエラーになります。困る場合は browser.importMapMocks: false で元に戻せます。ほかのブラウザや、isolate を無効にしている場合は、これまでどおりの仕組みで動きます
  • トレースの表示が失敗時だけ既定で有効になった。 browser.traceView.enabled は非推奨になり、browser.traceView.mode に置き換わります

Vite+ 1.0 に含まれるVitestの版については、Vite+ 1.0の記事を参照してください。

確認した範囲

2026年11月6日に、vitest.dev の公式ブログ(2026年11月2日付)、ガイド、CLIと設定のリファレンス、GitHub の v5.1.0 のリリースを確認し、npm のレジストリで 5.1.0 の公開日時(2026-11-02T16:12:37Z)と、これが最新版であることを確かめました。検証はUbuntu 24.04のコンテナ、Node.js 22.23.4、Vitest 5.1.0、テストファイル3つの小さなプロジェクトで、各操作を1回ずつ実行しています(実機検証)。大きなプロジェクトでの実行時間の短縮、ブラウザモード、Windowsでのポートの変更、上で紹介した2件のissueの内容は試していません。

テストの自動化や、AIエージェントを開発の流れに組み込む方法は、グリームハブの開発・AI・自動化のご相談で承っています。プロジェクトの規模やCIの構成によって進め方が変わるため、お問い合わせからご相談ください。

参考資料

この記事を共有XFacebook
鈴木 翔

技術の可能性に魅了され、学生時代からプログラミングとデジタルアートの分野に深い関心を持つ

この記事のテーマを、自社の次の一歩へ

自社での進め方を、具体的に。

つくりたい仕組み、既存システム、運用の条件を整理し、実現に向けた次の一歩を考えます。

  • 実現したい仕組み
  • 既存環境との接続
  • 運用の条件
開発・運用の構想を相談する

構想段階からご相談いただけます。この記事の情報を相談フォームに引き継ぎます。

最新記事をメールで受け取る