



WithCodeMedia-1-pc
WithCodeMedia-2-pc
WithCodeMedia-3-pc
WithCodeMedia-4-pc




WithCodeMedia-1-sp
WithCodeMedia-2-sp
WithCodeMedia-3-sp
WithCodeMedia-4-sp









生徒博士、Webサイトのデザインを修正したら、別のページのレイアウトが崩れてしまいました…。どうすれば防げますか?



よーく聞くんだぞ。それはまさにVisual Regression Testing(VRT)で解決できる問題なんじゃ!今回はVRTについて基本から実践まで詳しく解説するぞい!



ありがとうございます!よろしくお願いいたします!
Web制作において、コードの変更が意図しない視覚的な影響を及ぼすことは珍しくありません。CSSの修正が思わぬところでレイアウト崩れを引き起こしたり、コンポーネントの更新が他のページの表示に影響を与えたりすることがあります。
本記事では、Visual Regression Testing(VRT)の導入方法から主要ツールの比較、実践的な実装手順までを、実例を交えて詳しく解説します。VRTを導入することで、UIの品質を保ちながら、安心して制作を進められる環境を構築できます。
「学習→案件獲得」につなげた受講生のリアルな体験談も公開中!
働き方を変えたい方にも響くストーリーです。
橋本さん
将来に繋がるスキルを身に付けたいと考え、プログラミングに出会う。在学中の大学ではプログラミングの講義がなかったため、独学で学習していたが、限界を感じWithCodeに入学を決意。短期集中カリキュラムでプログラミング学習に打ち込んだ結果、見事卒業テストに合格し、案件を勝ち取りました。現在は、新たな言語の習得に向けて学習を継続しながら就職活動に向けて準備を行っています。
詳しくはこちらの記事をご覧ください。


橋本さんの主な制作実績はこちら


Visual Regression Testing(ビジュアルリグレッションテスト)は、アプリケーションの外観の変化を自動的に検出するテスト手法です。UIオートメーションでアプリケーションを操作し、画面のスクリーンショットを撮影して、ベースライン(基準となる画像)と比較することで、画素レベルの差分を検出します。
従来のユニットテストやE2Eテストは、主に機能の動作を検証します。例えば、「ボタンをクリックしたら正しいページに遷移するか」「フォームに入力したデータが正しく送信されるか」といったロジックベースのテストです。
一方、VRTは視覚的な変更に焦点を当てます。以下のような問題を検出できます:
現代のWeb制作では、以下のような課題があります:
VRTを導入することで、制作者が想定していない視覚的な変更を自動的に検出し、リリース前に修正できるようになります。


VRTの最大のメリットは、「安心できる」ことです。コードの変更が意図しない視覚的影響を及ぼしていないか、自動的に検証できるため、は安心してリファクタリングや新機能の追加ができます。
ロジックベースのテストだけでは、制作者の想定範囲外の問題をカバーできません。VRTは、人間の目視確認に近い方法でテストできるため、補完的な価値が非常に高いのです。
コードベースが大きくなるほど、1つの変更が他の部分に与える影響を把握することが困難になります。VRTを導入することで、以下のようなデグレーションを早期に発見できます:
VRTツールの多くは、差分画像を自動生成し、Pull Request(PR)に添付する機能を持っています。これにより、レビュアーは以下のメリットを得られます:
一見、テストを追加することは制作速度を低下させるように思えますが、実際には逆です。VRTを導入することで:
結果として、長期的には制作速度が大幅に向上します。
VRTツールの多くは、複数のブラウザやデバイスサイズでのテストをサポートしています。これにより、以下のようなテストを自動化できます:





メリットは分かったんですけど、ツールはどれを選べばいいんでしょうか?



うむ。VRTを実現するツールは複数存在する。ここでは、現在主流となっている4つのツールを詳しく解説するぞ!
Playwrightは、Microsoftが開発した汎用的なUIオートメーションツールで、VRT機能も備えています。
// tests/example.spec.ts
import { test, expect } from '@playwright/test';
test('homepage visual regression test', async ({ page }) => {
await page.goto('https://example.com');
// ページ全体のスクリーンショットを撮影し、ベースラインと比較
await expect(page).toHaveScreenshot('homepage.png');
});
test('button hover state', async ({ page }) => {
await page.goto('https://example.com');
// 特定の要素にホバーしてスクリーンショット
await page.locator('button.primary').hover();
await expect(page.locator('button.primary')).toHaveScreenshot('button-hover.png');
});E2Eテストをすでに使っていて、VRTも統合したい場合に最適です。外部サービスを使いたくない、または完全にコントロールしたい場合にも向いています。
Storybook Test Runnerは、Storybookのストーリーに対してVRTを実行できるツールです。内部的にPlaywrightを使用しています。
// .storybook/test-runner.ts
import { toMatchImageSnapshot } from 'jest-image-snapshot';
import type { TestRunnerConfig } from '@storybook/test-runner';
const config: TestRunnerConfig = {
async postRender(page, context) {
// ストーリーごとにスクリーンショットを撮影
const image = await page.screenshot();
expect(image).toMatchImageSnapshot({
customSnapshotIdentifier: context.id,
});
},
};
export default config;すでにStorybookを導入していて、コンポーネント駆動開発をしているチームに最適です。
Chromaticは、Storybookの開発チームが運営するフリーミアム型のSaaSサービスです。VRTツールの中で最も洗練されたUIと機能を提供しています。
# package.json
{
"scripts": {
"chromatic": "chromatic --project-token=<your-project-token>"
}
}
# CI/CD (GitHub Actions)
- name: Run Chromatic
uses: chromaui/action@v1
with:
projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
token: ${{ secrets.GITHUB_TOKEN }}デザイナーやPMを含むチーム全体でVRTを活用したい場合に最適です。初期費用を抑えつつ、高品質なVRT環境を構築できます。
reg-vizは、VRT用のOSSツール群を提供しているプロジェクトです。特にreg-suitとreg-actionsが人気です。
GitHub Actions + S3(またはGCS)を使って、Chromatic同等の機能を無料で実現できるツールです。
特徴:
GitHub Artifactを活用したよりシンプルな構成のツールです。
特徴:
# .github/workflows/vrt.yml
name: Visual Regression Test
on: [pull_request]
jobs:
vrt:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run visual regression test
run: |
npm run storybook:build
npm run test:vrt
- uses: reg-viz/reg-actions@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
image-directory-path: '__screenshots__'予算制約があり、無料でVRTを構築したい場合に最適です。技術的なカスタマイズを厭わないチームに向いています。
| ツール | 最適な用途 | コスト | 難易度 |
|---|---|---|---|
| Playwright | E2Eテストと統合したい | 無料 | 中 |
| Storybook Test Runner | Storybook中心の開発 | 無料 | 低 |
| Chromatic | チーム全体での活用 | 無料〜有料 | 低 |
| reg-viz | 予算制約がある | 無料 | 中〜高 |





VRT導入は実際どうやって始めればいいんですか?



良い質問じゃ。ここでは、最も人気のあるChromatic + Storybookの組み合わせを例に、VRT導入の具体的なステップを解説するぞ!
まず、プロジェクトにStorybookをインストールします。
# Storybookの自動セットアップ
npx storybook@latest init
# または手動でインストール
npm install --save-dev @storybook/react @storybook/react-vite// src/components/Button/Button.stories.tsx
import type { Meta, StoryObj } from '@storybook/react';
import { Button } from './Button';
const meta: Meta<typeof Button> = {
title: 'Components/Button',
component: Button,
tags: ['autodocs'],
};
export default meta;
type Story = StoryObj<typeof Button>;
// 基本的なボタン
export const Primary: Story = {
args: {
variant: 'primary',
children: 'ボタン',
},
};
// セカンダリボタン
export const Secondary: Story = {
args: {
variant: 'secondary',
children: 'ボタン',
},
};
// 大きいボタン
export const Large: Story = {
args: {
variant: 'primary',
size: 'large',
children: '大きいボタン',
},
};ポイント: テストしたいすべてのバリエーション(状態、サイズ、色など)をストーリーとして作成します。これらのストーリーがVRTのテスト対象になります。
1. Chromatic公式サイトにアクセスし、「Get started for free」をクリック


2. GitHubアカウントで認証


3. 新しいプロジェクトを作成


4. プロジェクトトークンを取得


# Chromaticパッケージをインストール
npm install --save-dev chromatic
# プロジェクトトークンを環境変数に設定
# .env.local
CHROMATIC_PROJECT_TOKEN=your_project_token_hereポイント: プロジェクトトークンは機密情報なので、環境変数として管理し、Gitにコミットしないようにしてください。
# Storybookをビルドし、Chromaticにアップロード
npx chromatic --project-token=<your-project-token>
# または、package.jsonにスクリプトを追加
{
"scripts": {
"chromatic": "chromatic"
}
}
# 実行
npm run chromatic初回実行時には、すべてのストーリーのスクリーンショットが撮影され、ベースラインとして保存されます。これが今後の比較基準となります。
Chromaticのダッシュボードで、撮影されたスクリーンショットを確認し、すべて承認(Accept)します。これにより、現在の状態が正式なベースラインとして設定されます。
ポイント: 初回のベースライン作成では、デザイナーやPMにもレビューしてもらい、意図した通りの表示になっているか確認することが重要です。
Pull Requestごとに自動的にVRTを実行するように、CI/CDパイプラインに統合します。
# .github/workflows/chromatic.yml
name: Chromatic
on:
pull_request:
branches:
- main
push:
branches:
- main
jobs:
chromatic:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
fetch-depth: 0 # Chromaticが変更履歴を追跡するために必要
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run Chromatic
uses: chromaui/action@v1
with:
projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
token: ${{ secrets.GITHUB_TOKEN }}
onlyChanged: true # 変更されたストーリーのみテスト
exitZeroOnChanges: true # 差分があってもビルドを失敗させない1. GitHubリポジトリの「Settings」→「Secrets and variables」→「Actions」に移動


2.「New repository secret」をクリック


3. Name: CHROMATIC_PROJECT_TOKEN
4. Value: Chromaticのプロジェクトトークン


ポイント: onlyChanged: trueオプションを使うことで、変更されたストーリーのみをテストし、スナップショット数を節約できます。
VRTを日常の制作ワークフローに組み込みます。
npm run storybook)




VRTを導入するにあたってトラブルシューティングのことも知りたいです!



うむ。ここでは、主なトラブルシューティングを4つ紹介するぞい!
異なるOS間(macOS、Windows、Linux)でフォントのレンダリングが異なるため、意図しない差分が発生することがあります。
現在時刻、ランダムなデータ、アニメーションなどの動的コンテンツは、毎回異なる結果になるため、常に差分として検出されてしまいます。
// Storybookでアニメーションを無効化
// .storybook/preview.ts
export const parameters = {
chromatic: {
// アニメーションの完了を待つ
delay: 300,
// アニメーションを無効化するCSS
disableAnimations: true,
},
};外部APIからデータを取得するコンポーネントは、APIの応答が変わるたびに差分が発生します。
// MSWでAPIをモック化
// .storybook/preview.ts
import { initialize, mswDecorator } from 'msw-storybook-addon';
initialize();
export const decorators = [mswDecorator];
// ストーリーでモックを定義
export const Default: Story = {
parameters: {
msw: {
handlers: [
rest.get('/api/users', (req, res, ctx) => {
return res(
ctx.json([
{ id: 1, name: '山田太郎' },
{ id: 2, name: '佐藤花子' },
])
);
}),
],
},
},
};Chromaticの無料プランは月5,000スナップショットまでです。大規模プロジェクトでは、すぐに上限に達する可能性があります。





博士、VRTって導入したら終わりじゃないんですか?



それは大きな間違いじゃ。VRTは運用してこそ価値が出る。
むしろ導入後が本番じゃ!
VRTの導入効果を定量的に測定するために、以下の指標を追跡しましょう:
VRTは導入して終わりではありません。以下のポイントで継続的に改善していきましょう:





ここまで聞くと
もう人間のチェックはいらなくなりませんか?



それは極端じゃ。VRTで多くのことが自動化されるが、やはり人間の判断が重要な場面もあるんじゃ!
VRTは画素レベルの差分を検出しますが、その変更が良いか悪いかは判断できません。例えば、1pxのズレを検出しても、それがユーザー体験に影響するかどうかは人間が判断する必要があります。
実践のコツ:
VRTは視覚的な変更を検出しますが、アクセシビリティの問題は検出できません。色のコントラスト比、キーボード操作、スクリーンリーダー対応などは、人間が意識的にチェックする必要があります。
実践のコツ:
技術的には正しく実装されていても、ビジネス要件を満たしていなければ意味がありません。UIの変更がビジネスゴールに沿っているかは、人間が評価する必要があります。
実践のコツ:
VRTは定義されたストーリーのみをテストします。想定外のエッジケース(非常に長いテキスト、特殊文字、極端なデータなど)は、人間が意識的にテストケースとして追加する必要があります。
実践のコツ:



VRTって自動テストだと思ってましたけど、結局人間の判断が重要なんですね!



その通りじゃ!VRTは問題を「検出」してくれるが、その問題を「解決」するのは人間の仕事なんじゃ。VRTと人間の強みを組み合わせることで、最高品質のUIを作れるんじゃぞ!



はい!VRTを使いこなして、品質の高いWebサイトを作ります!ありがとうございました!
本記事では、Visual Regression Testing(VRT)の導入方法について、基本から実践まで詳しく解説しました。
重要なポイントは以下の通りです。
・VRTとは:アプリケーションの外観の変化を画素レベルで自動検出するテスト手法
・主なメリット:安心して制作できる環境、デグレーションの早期発見、レビュープロセスの効率化
・主要ツール:Playwright(E2E統合向け)、Storybook Test Runner(Storybook中心)、Chromatic(チーム協働向け)、reg-viz(無料志向)
・導入ステップ:Storybookセットアップ→Chromatic連携→CI/CD統合→運用ワークフロー確立
・注意点:フォントレンダリング、動的コンテンツ、外部API依存、スナップショット数管理
・人間の役割:デザイン品質の最終判断、アクセシビリティ評価、ビジネス要件との整合性確認
WithCodeで学んだフロントエンドの基礎知識に、VRTを組み合わせれば、どんな大規模なプロジェクトでも自信を持って制作できます。
VRTは最初の導入こそ手間がかかりますが、長期的には制作速度と品質の両方を向上させる強力なツールです。小さなプロジェクトから始めて、徐々にカバレッジを拡大していくことをおすすめします。


WithCodeでは、Web制作の基礎からVRTのような高度な開発手法まで、実践的なスキルを段階的に学べます。
副業・フリーランスが主流になっている今こそ、自らのスキルで稼げる人材を目指してみませんか?
未経験でも心配することはありません。初級コースを受講される方の大多数はプログラミング未経験です。まずは無料カウンセリングで、悩みや不安をお聞かせください!
公式サイト より
今すぐ
無料カウンセリング
を予約!