Storybook v8 Visual TestsでChromaticのVRTを導入してみた
はじめに
Storybookがv8になって、localのStorybook上でChromaticのVRTが行えるVisual Testsを導入してみました。
今回はその導入背景やVisual Testsの使用感をお伝えしていきたいと思います。
導入した背景・課題
デザインシステムの共通コンポーネントのUI変更があった際どこのコンポーネントに影響範囲が及んでいるかの検知をVRTを通して素早く検知・確認したく今回Chromaticを導入しました。
ただ、Chromaticは無料枠だとスナップショットの枚数が毎月5000枚までしか利用できないのでなるべくコストをかけたくないですよね。
Starterプランでも$149/月(約21,000円)と料金が高い。
CIに乗せると1commit毎にSnapshotを取ってしまい枚数の上限を超えてしまう懸念があったので、
ローカルで差分出力したい時にだけ使う目的で、Visual Testsを導入しました。
VisualTests導入・設定
Chromaticの導入
基本的な導入については公式サイトや技術記事が参考になるので割愛します。
Storybook上でVisual Testsの設定方法
前提
- Chromaticが既に導入されている中で説明していきます
- storybook v7.6以上から対応可能
だいたい公式サイトに記載されていることの内容です
まず@chromatic-com/storybook
を導入
npx storybook@latest add @chromatic-com/storybook
chromatic.config.jsonの設定
chromatic.config.json
を設定しているmainやpreviewを纏めている./storybook
の隣に作成。
こちらで、ChromaticのProjectId、debugモードなどを設定します。
{
"projectId": "Project:******************",
"zip": true,
"debug": true,
"buildScriptName": "build-storybook",
"onlyChanged": true,
"storybookBaseDir": "packages/ui",
}
筆者が主に使ったオプション
-
onlyChange
: 前回分のVRTの差分のみを出力したい場合は、onlyChanged
を設定することで差分のみが出力 -
buildScriptName
: VisualTestsを実行させる時に、storybookをbuildする必要があるので、コマンド名をカスタムしている場合は指定が必要 -
storybookBaseDir
: Monorepoでやっている場合は、参照されるディレクトリ構造が通常と異なる場合は指定が必要 -
debug
: 実行ログであるchromatic.logの生成
またその他のOptionも以下のドキュメントに記載されています。
実際に使ってみる
設定を終えると「▶️」のボタンが表示され、VRTを実行できます。
(Visual Testsのパネルでも実行可能)
onlyChanged
を設定していると前回Build分の差分を比較し、ButtonのSecondaryのテキストを「Button → ボタン」と変更してみると赤枠で囲っているVisualTestsに差分が出ていることが分かります。
(ちょい分かりづらいですが、)
また、どれだけStoryの差分があるかも左下に表示したりどこのStoryに差分があるか薄黄色になっています。
ちなみにChromatic上でもVRTの出力がされていることが確認できます。
工夫した点
mockdateを使った日付の固定
onlyChangedを扱っている上でVRTを行う時、new Date()
を使ってコンポーネントを表示しているStoryがある場合、日を跨ぐ毎に日付がずれて余計な差分を生んでしまうことがあります。
その場合は、mockdateを使用してStorybook上の日付を固定しました。
固定方法はpreview.ts
に固定したい内容を定義するだけで良いです。
import MockDate from 'mockdate';
///
MockDate.set(new Date('2024-04-01T00:00:00'));
const preivew = {
///
};
export default preview;
現状CIには載せていない
無料枠の中でChromaticを利用するにあたり、今携わっているPJのStory数が180近くあり1commit毎にSnapShotを取るとなるとあっという間に5000枚超えると思い現状はローカルのVisualTestsだけにしています。
もしCIに乗せる場合も特定のコンポーネントの変更時にTriggerを限定的にしてうまくコスト管理する手法はありそうですが、UITestsがpennding状態になり続けるのでCIが完了していないと勘違いしていましたが、最近autoAcceptChanges
でcompleteにできることに気づき検討ありでした。
まとめ
- StorybookのVisualTestsでローカル上でもVRTが可能に。
-
onlyChanged
で前回差分のものだけ出力可能 - 日付を固定させたい場合は、
mockdate
おすすめ
Discussion