ホーム自己紹介ブログ
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

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

フロントエンド
テスト

-

読者になる

|

シェアする

|

silverbirders

silverbirder

Webソフトウェアエンジニア
個人ブログキュレーション こぶりー 運営

ブログを応援する

この記事がよかったら、お布施という形で応援してもらえるとうれしいです。

おふせぼたん

※ ログイン不要で投稿できます。

※ 同じブラウザから投稿を削除できます。

0

読み込み中...

次の記事へ前の記事へ

関連する記事

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

Webmention 使ってみた

Webmention というのを最近知りました。 名前の通り、Web 上でメンションすることができます。 受信側、送信側、どちらも対応したので感想を残そうと思います。 Webmention ざっくりと Web AサイトにBサイトのリンクをつ

2026年09月08日

フロントエンド
個人開発
モジュールアップデートでやっていること

ITヲタクな AI くんにピッタリな仕事の一つは、モジュールアップデート。 特に、メジャーアップデートが超助かる。 昔だったら 数ヶ月掛かった移行も、数日たらずに対応できるようになったので、 さすが ITヲタクくん。 対応してよかったフロー

2026年07月24日

AI
フロントエンド
写経テストコードを全部消した

以下で書いた通り、プロダクトコードを写経したテストコードを削除しました。 "こぶりー" ( https://kobliy.vercel.app/ ) という個人ブログを読むアプリのコードです。 https://silverbirder.gi

2026年06月08日

AI
フロントエンド
テスト

タグ「テスト」の記事

Testcontainersで開発PR単位にE2Eテストなど

Testcontainers + Playwright + Cucumber.js による受け入れテストを、公私ともに活用しています。 運用していて気づいた点について、また書き残そうと思います。 開発PR単位でE2Eテスト これはTestc

2026年09月07日

テスト
ブローガスト25日目: ミューテーションテストのキルゼロテスト

テストコードをテストする、ミューテーションテスト。 プロダクションコードを突然変異でコードを書き換えたら(ミューテーション)、テストが失敗してくれるかどうか。 失敗するということは、不具合を検知できたということです。 ミューテーションする箇

2026年08月25日

テスト
Testcontainers運用経験から分かった、良い点・困る点

お仕事先のWebアプリケーションに、Testcontainersを導入運用して数ヶ月経過しました。 良い点と困る点について、書き残しておきます。 前提 簡単な前提として、バックエンドDB・APIとフロントエンドの3層構成のよくあるWebアプ

2026年07月08日

テスト
← ブログ一覧へ