ホーム自己紹介ブログ
NO.185
DATE2025. 12. 03

Storybook の Story を Vitest Browser Mode with Playwright で VRT

Storybook の Story オブジェクトを Vitest の Browser Mode だけで、Visual Regression Test(VRT)ができるようになりました。

本記事では、その導入手順をコンパクトに紹介します。

前提

以下のセットアップが完了していることを前提に進めます。

  • Storybook のセットアップ
    • 👉 https://storybook.js.org/docs/get-started/setup
  • Vitest Browser Mode のセットアップ
    • 👉 https://vitest.dev/guide/browser

また、以下 2 つの Storybook フレームワークで動作確認済みです。

  • npmjs.com
    • ※併せて以下のセットアップが必要
      • npmjs.com
  • npmjs.com

加えて、この記事も参考になります。

Portable stories in Vitest | Storybook docs
Storybook is a frontend workshop for building UI components and pages in isolation. Thousands of teams use it for UI development, testing, and documentation. It's open source and free.
storybook.js.org

Vitestの設定

まず、Vitest で Browser Mode を有効にします。

// vitest.config.js
import react from "@vitejs/plugin-react";
// import nextjs from "vite-plugin-storybook-nextjs"; // nextjs-vite を使う場合
import { playwright } from "@vitest/browser-playwright";
import { defineConfig } from "vitest/config";
 
/*
 * @type {import("vitest/config").ViteUserConfigExport}
 */
const baseConfig = {
  plugins: [
    react(),
    // nextjs(),
  ],
  test: {
    include: ["src/**/*.test.{ts,tsx}", "src/**/*.spec.{ts,tsx}"],
    setupFiles: ["./vitest.setup.js"],
    browser: {  // 👈 Browser Mode の設定
      enabled: true,
      provider: playwright(),
      headless: true,
      instances: [{ browser: "chromium" }],
    },
  },
};
 
export default defineConfig(baseConfig);

Vitest Browser Mode 向けのセットアップも追加します。

// vitest.setup.js
import "vitest-browser-react";

Story を VRT する

では、サンプルコンポーネントと Story、テストコードを作成していきます。

コンポーネント

// ./bubble-text.tsx
type Props = {
  text: string;
};
 
export const BubbleText = ({ text }: Props) => {
  return (
    <div>{text}</div>
  );
};

Storyファイル

// ./bubble-text.stories.tsx
import type { Meta, StoryObj } from "@storybook/react-vite";
// or
// import type { Meta, StoryObj } from "@storybook/nextjs-vite";
 
import { BubbleText } from "./bubble-text";
 
const meta = {
  args: {
    text: "Hello, World",
  },
  component: BubbleText,
} satisfies Meta<typeof BubbleText>;
 
export default meta;
type Story = StoryObj<typeof meta>;
 
export const Default: Story = {};

VRT のテストコード

1. @storybook/nextjs-vite を使用する場合

composeStories で Story オブジェクトをまとめて取得し、 Story.run() → toMatchScreenshot() の流れで VRT できます。

// ./bubble-text.spec.tsx
import { composeStories } from "@storybook/nextjs-vite";
import { describe, expect, it } from "vitest";
import * as stories from "./bubble-text.stories";
 
const Stories = composeStories(stories);
 
describe("BubbleText", () => {
  it.each(Object.entries(Stories))("should %s snapshot", async (_, Story) => {
    // Act
    await Story.run();
 
    // Assert
    await expect(document.body).toMatchScreenshot();
  });
});

2. @storybook/react-vite を使用する場合

@storybook/nextjs-vite と同様に、composeStories で Story オブジェクトをまとめて取得し、 render → toMatchScreenshot() の流れで VRT できます。

import { composeStories } from "@storybook/react-vite";
import { describe, expect, it } from "vitest";
import { render } from "vitest-browser-react";
import * as stories from "./bubble-text.stories";
 
const Stories = composeStories(stories);
 
describe("BubbleText", () => {
  it.each(Object.entries(Stories))("should %s snapshot", async (_, Story) => {
    // Act
    const { getByTestId } = await render(
      <div data-testid="test">
        <Story />
      </div>,
    );
 
    await expect(getByTestId("test")).toMatchScreenshot();
  });
});

これにより、Storybook と Vitest だけで完結する VRT 環境が構築できました!🎉

備考

StorybookのcomposeStoryとVitestのtoMatchScreenshotを組み合わせたVRT
zenn.dev
フロントエンド
テスト

-

コメント

0

読み込み中...

シェアする

フォローする

購読する

次のページ

使っていない、買ったもの2025

前のページ

最終的な決断は自分自身

関連する記事

タグ「フロントエンド」の記事

AIの書いたコードの手直しを減らすお作法

AI にコードを書かせた後、余計なコードを見つけて消す作業があります。 不毛なことなので、それらの作業を減らすためのお作法を紹介します。 未使用コードを消す 以下でも書きましたが、未使用コードの検査に knip を使うことが多いです。 ht

2026年02月25日

AI
フロントエンド
iframeの難しさ

最近、iframeを使っています。 クライアントサイドで埋め込む想定で、iframeを使おうとしています。 色々と苦労したことがあったので、書いて残しておこうと思います。 レスポンスヘッダー 前提として、ウェブアプリケーションをプロダクショ

2026年02月18日

フロントエンド
ブラウザ
SVGを書くと数学の知識が必要だった

紙を積んだイラストをSVGで書こうとしていました。 (当たり前ですが)図形を表現するためには数学の知識が必要で、学生の頃の記憶を思い出したので疲れました。 所感について、諸々書こうと思います。 成果物 実際に完成したのは、以下の画像ができま

2026年02月17日

フロントエンド

タグ「テスト」の記事

CSSを、Vitestでテストしてみる

以下の記事で書いた CSSをテストする方法について、試してみました。 https://zenn.dev/silverbirder/articles/df6752b230f04c ソースコードは、以下に置いています。 https://gith

2026年02月10日

フロントエンド
テスト
CSS Layout Testing というテスト手法の提案

Web のフロントエンド実装において、次のようなミスによってデザイン崩れを起こしてしまったことはありませんか。 flex-shrink の指定を忘れて、要素が押しつぶされてしまった z-index の指定を間違えて、要素が意図せず前面(また

2026年01月10日

フロントエンド
テスト
単体テストを全通り書くんじゃない!

AIの進化によって、プロダクションコードに対するテストコードは、以前と比べて格段に書きやすくなったと感じています。 単体テストに関する基本的なお作法については、以前に以下の記事で整理しました。 興味があれば、参考として読んでもらえると嬉しい

2026年01月09日

テスト
← ブログ一覧へ