🍧

Vitest Browser ModeにVisual Regression Testが来るぞ

に公開

先日VitestにこちらのPull Requestがマージされ、Vitest Browser ModeでVisual Regression Test(VRT)ができるようになりました(まだ正式リリースはされていません)。

https://github.com/vitest-dev/vitest/pull/8041

おそらくVitest v4のリリースで正式に使えるようになりますが、beta versionで実際に試すことができるので試してみました。

デモ

デモ用のコードはこちらのRepositoryにあります(ProviderはPlaywrightを使用しています)。vitest.configなどの設定は従来のbrowser modeの設定と全く同じで問題ないです。Vitestのバージョンは4.0.0-beta.7を使用しています。

https://github.com/apple-yagi/vitest-browser-mode-vrt-demo

expectの引数にElementを渡し、toMatchScreenshotを実行することでVRTができます。以下は実際のコードと生成された画像です。

https://github.com/apple-yagi/vitest-browser-mode-vrt-demo/blob/12c2075ec88f6f979f968da0882efe3e01172831/src/components/contact-form.test.tsx#L8

https://github.com/apple-yagi/vitest-browser-mode-vrt-demo/blob/main/src/components/screenshots/contact-form.test.tsx/contact-form-chromium-darwin.png

snapshotに差分ができるとテストがfailし、以下のようなディレクトリにdiff画像などが出力されます。PlaywrightのようにreportをWeb上で見ることはできません。

オプションで許容する差分などを指定することができます。今のところvitest.configなどで一括で指定することはできなさそうです(Extending Matchersを使用すればできると思いますが)。

toMatchScreenshotの内部実装

内部ではPlaywrightのscreenshotでスクリーンショットを撮り、pixelmatchで画像を比較しているようです。

https://github.com/macarie/vitest/blob/50047212f2a2b7242809f155b869a2f7aaef0457/packages/browser/src/node/commands/screenshot.ts#L66

https://github.com/macarie/vitest/blob/50047212f2a2b7242809f155b869a2f7aaef0457/packages/browser/src/node/commands/screenshotMatcher/comparators/pixelmatch.ts

実務での活用について

これまでPlaywrightなどで行っていたVRTがVitestで行えるようになり、とても気軽にVRTをすることができるようになりました。しかし、VRTはFlakyになりがちな点、環境の差異をDockerなどで吸収する必要がある点などを考慮すると、そうバンバンVRTを増やすのは後々辛くなることが予想されます。そのため、VRTで保証したい品質を定義し、必要な範囲でのみ使用することが必要となります。

そうかつ

実務で使用するかは判断が必要ですが、純粋にVitest Browser ModeでVRTができるようになってめでたいですね🎉
自分もVitest Browser ModeにVRTのアサーションを生やそうと2ヶ月前くらいに思ってできていなかったのでVitest v4でリリースされるのが楽しみです(エディターのような複雑なところのUnitテストで使用したいと思っていた)。

Discussion