🐏

Vitest Browser Mode が凄い

2025/01/31に公開

Vitest Browser Mode とは

https://vitest.dev/guide/browser/

Vitest Browser Mode(ブラウザモード)とは、2025/1/31 現在 Experimental として公開されている Vitest の API で、ブラウザ上でテストを実行できる機能のことです。
ブラウザ上で実行可能になったことで必要なモックを最小限に、実際に操作される環境と同じ環境でテストをすることができます。
実際に試してみた内容をこの記事では紹介します。

試してみた

通常のテストと Browser Mode のテストをそれぞれ作成し、比較してみました。
具体的には、テストコードのモックの有無を比較したかったため、ボタンを押下すると window.scrollTo() でスクロールするだけの簡単なアプリを作成し、そのテストコードを記述しました。

アプリの画面はこちらです。

試してみたコードはこちらです。
https://github.com/t0daaay/vitest-browser-mode-example

ライブラリのインストール

$ pnpm create vite で Vue, TypeScript の環境を立ち上げた後、以下のライブラリを devDependencies としてインストールしました。
$ pnpm add -D vitest happy-dom @vitest/browser @testing-library/vue vitest-browser-vue playwright

https://github.com/t0daaay/vitest-browser-mode-example/blob/5eb044011ae117462f0c22fddb8f031cbb628411/package.json#L17-L29

アプリの実装

前述した通り、ボタンを押下すると window.scrollTo() でスクロールするだけの簡単なアプリです。
https://github.com/t0daaay/vitest-browser-mode-example/blob/5eb044011ae117462f0c22fddb8f031cbb628411/src/App.vue#L1-L28

Vitest の設定

Vitest には Workspace という複数のテストプロジェクトごとに設定を実施する方法があるので、こちらを使って通常のテストと Browser Mode のテストをそれぞれ設定するようにしました。
https://vitest.dev/guide/workspace

https://github.com/t0daaay/vitest-browser-mode-example/blob/5eb044011ae117462f0c22fddb8f031cbb628411/vitest.workspace.ts#L1-L25

テストコードの記述

通常のテスト

Happy DOM を使った一般的なテストコードです。
https://github.com/t0daaay/vitest-browser-mode-example/blob/5eb044011ae117462f0c22fddb8f031cbb628411/src/App.happydom.spec.ts#L1-L22

window.scrollTo() による実際のスクロールの動きを Happy DOM や JSDOM 上でテストをすることは難しいため、モック化で呼び出しの引数が適切に設定されているかどうかをテストしています。
このテストだと実際の挙動をテストしている訳ではないので少し信頼性に不安が残ります。

Browser Mode のテスト

本題の Browser Mode のテストです。
https://github.com/t0daaay/vitest-browser-mode-example/blob/5eb044011ae117462f0c22fddb8f031cbb628411/src/App.browser.spec.ts#L1-L19

コードを見て分かるように、通常の Vitest のテストコードの書き方とは異なります。

  • window.scrollTo()
  • document.body.scrollHeight
  • window.scrollY

などのブラウザ API が有効になっていることで実際の挙動がテストでき、直感的なテストコードを書くことができるようになっていることが分かります。

$ npx vitest を実行してみると...

ブラウザ上でテストを実行してくれました。

その他

ヘッドレスブラウザでのテストも実行可能です。

$ npx vitest --browser.headless

感想

ブラウザ上でテストできるようになったことで、信頼性の高いテストの実施と実態に沿った分かりやすいテストの記述ができるようになったと感じました。
大量のテストコードに対して Browser Mode でテストを実施した際の実行時間が気になりますが、かなり期待できる機能なのではないかと個人的には感じております。
Browser Mode は現在まだ Experimental で バグを含んでいる可能性があり API の仕様も安定していないため、安定したバージョンのリリースが待ち遠しいです。

Discussion