Storybook

UI コンポーネントを独立して開発・テスト・ドキュメント化するツール

フロントエンドテスト

Storybook とは

Storybook は、UI コンポーネントをアプリケーションから独立して開発・テスト・ドキュメント化するツールである。各コンポーネントの様々な状態 (Story) をカタログとして一覧でき、デザイナーとの協業やビジュアルリグレッションテストに使われる。

Story の書き方

// Button.stories.tsx
import type { Meta, StoryObj } from '@storybook/react';
import { Button } from './Button';

const meta: Meta<typeof Button> = {
  component: Button,
  tags: ['autodocs'],
};
export default meta;

type Story = StoryObj<typeof Button>;

export const Primary: Story = {
  args: { variant: 'primary', children: 'Click me' },
};

export const Secondary: Story = {
  args: { variant: 'secondary', children: 'Cancel' },
};

export const Disabled: Story = {
  args: { variant: 'primary', children: 'Submit', disabled: true },
};

export const Loading: Story = {
  args: { variant: 'primary', children: 'Saving...', loading: true },
};

メリット

API やルーティングなしでコンポーネントを独立して開発でき、正常・エラー・ローディング・空状態を一覧で確認できる。Props の自動ドキュメント生成、スクリーンショット比較によるビジュアルテスト、Chromatic を使ったデザイナーとの協業も可能だ。

インタラクションテスト

import { within, userEvent } from '@storybook/test';

export const Submitted: Story = {
  play: async ({ canvasElement }) => {
    const canvas = within(canvasElement);
    await userEvent.type(canvas.getByLabelText('Email'), 'alice@example.com');
    await userEvent.click(canvas.getByRole('button', { name: 'Submit' }));
    await expect(canvas.getByText('送信完了')).toBeInTheDocument();
  },
};

Chromatic (ビジュアルリグレッションテスト)

# GitHub Actions で Chromatic を実行
- uses: chromaui/action@v11
  with:
    projectToken: ${{ secrets.CHROMATIC_TOKEN }}

PR ごとにスクリーンショットを比較し、意図しない UI の変更を検知する。

テストピラミッドでの位置づけ

テスト ツール 対象
単体テスト Vitest ロジック
コンポーネントテスト Storybook UI コンポーネント
E2E テスト Playwright ユーザーフロー

実務での活用方法は関連書籍にも詳しい。

関連用語