0Pricing
React Academy · レッスン

Storybookのテストとビジュアルリグレッション

interaction tests用にplay functionsを実行し、Chromaticを統合して視覚的な差分を確認します。

「Storybookのテストとビジュアルリグレッション」はCoddyKit上の無料React Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。

Storybook でテストする理由

Storybook 7 以降にはインタラクションテスト(play 関数)用の @storybook/test が付属しており、Chromatic と連携して自動的なビジュアルリグレッションテストも実行できます。これらはすべてコンポーネントエクスプローラーから離れずに行えます。

Play 関数

play 関数はストーリーのレンダリング後に実行され、@storybook/test のユーティリティを使ってユーザーの操作をシミュレートします。結果は Interactions パネルに表示されます。

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

export const FilledForm: Story = {
  play: async ({ canvasElement }) => {
    const canvas = within(canvasElement);
    await userEvent.type(canvas.getByLabelText('Email'), 'test@example.com');
    await userEvent.click(canvas.getByRole('button', { name: /submit/i }));
    await expect(canvas.getByText('Success!')).toBeInTheDocument();
  },
};

Play 関数でのアサーション

play 関数の中では、@storybook/test から(Vitest/Jest から再エクスポートされた)expect を使用して、操作後のコンポーネントの状態を検証します。

play: async ({ canvasElement }) => {
  const canvas = within(canvasElement);
  const button = canvas.getByRole('button', { name: /add/i });
  await userEvent.click(button);
  await expect(canvas.getByText('1 item')).toBeInTheDocument();
  await userEvent.click(button);
  await expect(canvas.getByText('2 items')).toBeInTheDocument();
},

Storybook Test Runner でのストーリーテストの実行

@storybook/test-runner パッケージは、play 関数を持つ各ストーリーを Jest テストに変換します。1 つのコマンドで CI 上で実行できます。

# Install
npm install @storybook/test-runner --save-dev

# package.json
"test-storybook": "test-storybook"

# Run (requires Storybook to be running)
npm run test-storybook

ビジュアルリグレッションテストとは

ビジュアルリグレッションテストではコンポーネントのスクリーンショットをスナップショットとして保存し、コミット間のピクセル単位の差分を検出します。Chromatic、Playwright、Percy はよく使われるツールです。

Chromatic のセットアップ

Chromatic はビジュアルテスト用の公式 Storybook クラウドサービスです。ストーリーをプッシュすると、Chromatic がスクリーンショットを以前のベースラインと比較します。

# Install
npm install chromatic --save-dev

# Run (get project token from chromatic.com)
npx chromatic --project-token=<YOUR_TOKEN>

# CI: add to GitHub Actions
- name: Chromatic
  run: npx chromatic --project-token=${{ secrets.CHROMATIC_TOKEN }}

ビジュアル変更のレビュー

Chromatic には、レビュー担当者がビジュアル変更を承認または却下できる差分 UI があります。承認した変更は新しいベースラインになり、却下した変更があると PR はブロックされます。

Storybook でのスナップショットテスト

テストランナーでは、@storybook/addon-a11y を使ったアクセシビリティチェックを、すべてのストーリーに対して CI で自動的に実行することもできます。

// .storybook/test-runner.ts
import { checkA11y } from 'axe-playwright';

export default {
  async postVisit(page) {
    await checkA11y(page, '#storybook-root', {
      detailedReport: true,
    });
  },
};

Storybook のコンポジション

異なるリポジトリにある複数の Storybook を 1 つの UI にまとめられます。プロジェクト間で共有するデザインシステムに便利です。

// .storybook/main.ts
refs: {
  'design-system': {
    title: 'Design System',
    url: 'https://design-system.example.com',
  },
},

レスポンシブなストーリーのテスト

viewport addon を使用して、モバイル、タブレット、デスクトップのサイズでストーリーをテストします。ストーリーの parameters に viewport を設定すると、特定のサイズに固定できます。

export const Mobile: Story = {
  parameters: {
    viewport: { defaultViewport: 'mobile1' },
  },
  args: { label: 'Mobile Button' },
};

不安定なテストの防止

アニメーションの完了を待つために play 関数で delay を使用するか、Storybook の preview でアニメーションをグローバルに無効にすると、不安定なビジュアルテストを防げます。

// .storybook/preview.ts
export const parameters = {
  chromatic: { disableSnapshot: false },
  // Disable CSS animations for consistent screenshots
};

// Global CSS for tests:
// * { animation: none !important; transition: none !important; }

カバレッジレポート

test-storybook --coverage を実行すると、play 関数のテストでどのコンポーネントの行が実行されたかを示すカバレッジレポートを生成できます。

クイックチェック

Storybook の play 関数は、どこでインタラクションを実行しますか?

まとめ

Play 関数は @storybook/test を使い、Storybook 内でコンポーネントのインタラクションをテストします。テストランナーは play 関数を Jest テストに変換して CI で実行できます。Chromatic はビジュアルリグレッション用のスナップショットを追加し、UI のピクセル単位の変更を検出してマージ前のレビューを可能にします。

よくある質問

「Storybookのテストとビジュアルリグレッション」レッスンは無料ですか?

はい。「Storybookのテストとビジュアルリグレッション」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。

「Storybookのテストとビジュアルリグレッション」で何を学びますか?

interaction tests用にplay functionsを実行し、Chromaticを統合して視覚的な差分を確認します。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

React Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「Storybookのテストとビジュアルリグレッション」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このReact Academyレッスンでコードを書いて実行できますか?

はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ReactプロジェクトでのStorybookセットアップ
  2. CSF3 Storiesの記述
  3. Args、Controls、Actions Addon
  4. Storybookのテストとビジュアルリグレッション
← React Academyに戻る