Claude Codeでコードを書き、GitHubへPushし、GitHub Actionsでテストする。
ここまででも開発はかなり自動化できます。
しかし、本番に近い状態で本当に動くかを確認するなら、もう一段先があります。
それが、Vercelに実際にデプロイされたPreview環境へPlaywrightを実行する自動E2Eです。
Pull RequestごとにVercel Previewを発行し、デプロイ成功後にPreview URLを取得。そのURLをPlaywrightへ渡し、ログイン・フォーム送信・主要画面・回帰確認まで自動でテストします。
この記事でわかること
- Vercel PreviewをQA環境として使う考え方
- Preview公開後にPlaywrightを自動実行する仕組み
- Preview URLをE2Eテストへ渡す方法
- QA用DB・ユーザー・Tenantを分離する理由
- 失敗したE2EをClaude Codeで調査する流れ
結論
Pull RequestごとにVercel Previewを作り、そのPreview URLに対してPlaywright E2Eを自動実行することで、「コード上では成功したが、実際のデプロイ環境では壊れていた」という問題を本番前に検出しやすくなります。Claude Codeは、その失敗原因の調査と修正を担当させるのが実践的です。
なぜローカルE2Eだけでは足りないのか
前の記事では、GitHub ActionsとPlaywrightを組み合わせ、PushやPull Request後にE2Eを実行する方法を紹介しました。
ただし、CI環境内で起動したアプリに対するテストと、実際にVercelへデプロイされたアプリに対するテストは完全に同じではありません。
たとえばPreview環境では、次のような問題が初めて表面化することがあります。
Previewで初めて見つかりやすい問題
- 環境変数の設定漏れ
- 本番相当Buildでだけ発生するエラー
- 認証Callback URLの不一致
- API・DB・外部サービスとの接続問題
- 実際の配信環境での画面崩れ・遷移エラー
つまり、Buildできることと、デプロイ後にサービスとして正常に使えることは別です。
Key Point
Preview E2Eは「コードのテスト」ではなく、「実際にデプロイされたアプリのテスト」と考えると分かりやすいです。
今回作るPreview自動QAの全体像
Claude Code
機能の実装・修正と、テスト失敗後の原因調査を担当します。
- 実装
- 原因調査
- 修正
Vercel Preview
Pull Requestごとに本番に近いアプリ環境をデプロイします。
- Preview Build
- Preview URL
- 環境変数
Playwright
Preview URLを開き、実際のブラウザでE2Eを実行します。
- ログイン
- 主要操作
- 回帰確認
-
1
Claude Codeで実装
featureブランチ上で機能追加や修正を進めます。
-
2
GitHubへPush
Pull Requestを作成し、変更内容をGitHubへ送ります。
-
3
Vercel Previewを生成
Pull Requestに紐づくPreview Deploymentが作成されます。
-
4
Preview URLを取得
デプロイ成功後、そのPreview環境のURLをテストへ渡します。
-
5
Playwright E2E
Preview上で主要ユーザーフローを実際にテストします。
-
6
Claude Codeで修正
失敗した場合はログやTraceを確認して修正します。
Vercel Previewとは
Vercelでは、GitHubなどのGitリポジトリと連携すると、ブランチやPull Requestの変更に応じてPreview Deploymentを作成できます。
Productionへ反映する前に、実際のURLで変更内容を確認できるのがPreview環境の大きなメリットです。
一般的な開発では、人間がPreview URLを開き、画面を確認してからマージします。
今回やるのは、その確認の一部をPlaywrightへ任せるという考え方です。
Pull Request
↓
Vercel Preview
↓
Preview URL
↓
Playwright
↓
PASS / FAIL
↓
Human Review
↓
Merge
deployment_statusを使ってデプロイ後にテストする
重要なのは、GitHubへPushされた直後ではなく、Vercel Previewのデプロイが完了してからPlaywrightを動かすことです。
GitHub ActionsではDeployment Statusの変化をトリガーにworkflowを起動する構成を取れます。
考え方は次の通りです。
on:
deployment_status:
そして、Deploymentが成功した場合だけE2Eを実行します。
if: github.event.deployment_status.state == 'success'
Preview URLへPlaywrightを実行するworkflow
基本構成は次のようになります。
name: Preview E2E
on:
deployment_status:
permissions:
contents: read
jobs:
e2e:
if: github.event.deployment_status.state == 'success'
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Setup Node
uses: actions/setup-node@v6
with:
node-version: lts/*
cache: npm
- name: Install dependencies
run: npm ci
- name: Install Playwright
run: npx playwright install --with-deps
- name: Run Preview E2E
run: npx playwright test
env:
PLAYWRIGHT_TEST_BASE_URL: ${{ github.event.deployment_status.target_url }}
- name: Upload Playwright report
if: ${{ !cancelled() }}
uses: actions/upload-artifact@v5
with:
name: preview-playwright-report
path: playwright-report/
retention-days: 30
そのままコピペで完成とは限らない
Deployment StatusのURL情報やイベントの発生方法は、GitHub・Vercel側の連携方法や設定によって確認が必要です。実際のリポジトリでは、イベントPayloadに入っているPreview URLを確認してから環境変数へ渡してください。
Playwright側はbaseURLを環境変数化する
Preview URLはデプロイごとに変化するため、テストコードへURLを直接書かない方が扱いやすくなります。
playwright.config.tsで環境変数を読み取ります。
import { defineConfig } from '@playwright/test';
export default defineConfig({
testDir: './tests',
workers: process.env.CI ? 1 : undefined,
retries: process.env.CI ? 2 : 0,
reporter: [
['html', { open: 'never' }]
],
use: {
baseURL:
process.env.PLAYWRIGHT_TEST_BASE_URL ||
'http://localhost:3000',
trace: 'retain-on-failure',
screenshot: 'only-on-failure',
},
});
テスト側ではURLを意識せず、相対パスを利用できます。
import { test, expect } from '@playwright/test';
test('Preview環境でログインできる', async ({ page }) => {
await page.goto('/login');
await page.getByLabel('メールアドレス').fill(
process.env.QA_EMAIL || ''
);
await page.getByLabel('パスワード').fill(
process.env.QA_PASSWORD || ''
);
await page.getByRole('button', {
name: 'ログイン'
}).click();
await expect(page).toHaveURL(/dashboard/);
});
Preview E2Eで何を確認する?
PreviewでのE2Eは、細かいUIのすべてをテストするより、まずサービスの主要ルートが壊れていないことを確認するのがおすすめです。
優先したいPreview E2E
- Preview URLへ正常にアクセスできる
- ログインできる
- ダッシュボードが表示できる
- 主要データを登録・編集できる
- 公開フォームなど重要な導線を完了できる
- 権限制御が壊れていない
QA専用ユーザーを用意する
Playwrightでログインテストを行うなら、E2E専用のユーザーを用意します。
普段利用している管理者アカウントをCIへ渡すのは避けた方が安全です。
おすすめ
Preview専用DB・QA専用Tenant・QA専用Userをセットで用意し、E2Eが作成するデータもProductionへ混ざらないようにします。
Production
├── Production DB
├── Production User
└── 実データ
Preview
├── Preview / QA DB
├── QA Tenant
├── QA User
└── Playwright Test Data
本番DBとPreviewを絶対に混ぜない
Preview環境自体が分かれていても、接続しているDatabaseがProductionと同じなら安全とは言えません。
Playwrightがフォーム送信やデータ作成を行えば、そのテストデータが本番DBへ保存される可能性があるためです。
最重要
Preview E2Eを導入する前に、Preview環境のDATABASE_URL・外部API・メール送信・決済・WebhookなどがProductionへ向いていないか必ず確認してください。
特にメール送信・通知・決済などの副作用がある処理は、QA環境では無効化するか、テスト専用の接続先へ向けます。
Preview Protectionがある場合はどうする?
Vercelの設定によっては、Preview Deploymentが一般公開されず、認証やDeployment Protectionの対象になる場合があります。
その場合、GitHub Actions上のPlaywrightから直接アクセスすると、アプリ画面ではなく認証画面へ到達することがあります。
このケースでは、組織・プラン・Protection設定に合わせて、CIが安全にPreviewへアクセスできる方法を設計する必要があります。
認証を無理に無効化しない
E2EのためだけにPreview全体を公開状態へ変更するより、Vercelが提供するProtection・Bypass系の仕組みやテスト専用設定を確認し、必要最小限のアクセス方式を選ぶ方が安全です。
失敗時はPlaywright ReportとTraceを残す
自動テストは、失敗したことだけ分かっても十分ではありません。
重要なのは「なぜ失敗したか」を後から追えることです。
HTML Report
どのテストがPASS / FAILしたかを一覧で確認します。
- Test Result
- Error
- Duration
Trace
テスト中の操作・Network・DOMなどを追跡しやすくします。
- Action
- Network
- DOM
Screenshot
失敗した瞬間の画面状態を視覚的に確認できます。
- UI Error
- Unexpected Page
- Visual State
失敗したらClaude Codeへ調査させる
Preview E2Eで失敗が検知されたら、次はClaude Codeを使って原因を調べます。
見るべき情報は、主に次の4つです。
Claude Codeへ渡したい情報
- GitHub Actionsの失敗ログ
- Playwrightのエラーメッセージ
- Trace / Screenshot
- 今回のPRで変更したdiff
単に「テストを直して」と渡すのではなく、
Preview E2Eが失敗しています。
以下を確認してください。
1. GitHub Actionsの失敗ログ
2. Playwrightの失敗テスト
3. 今回のgit diff
4. 既存機能への回帰可能性
そのうえで、
原因調査
↓
最小修正
↓
関連テスト
↓
E2E再実行
↓
diff report
まで進めてください。
テストを通すためだけに
検証条件を弱める変更は禁止です。
のように、QAの基準を落とさず原因から直すよう指示する方が安全です。
テストを通すためにテストを弱くしない
AIに失敗修正を任せるとき、非常に重要なのがこの考え方です。
テストが失敗したからといって、
- assertを削除する
- timeoutを極端に伸ばす
- 失敗しているテストをskipする
- 条件を緩めてPASSさせる
だけでは、本当の意味で問題は解決していません。
品質ゲート
「テストをPASSさせる」のではなく、「期待する仕様を満たした結果としてテストがPASSする」状態を目指します。
Productionへ進める条件を決める
Preview E2Eを導入したら、「Productionへマージしてよい条件」も明確にしておくと運用しやすくなります。
Merge前チェック例
- Lint PASS
- Typecheck PASS
- Unit Test PASS
- Build PASS
- Preview E2E PASS
- 必要な場合は人間のレビューPASS
この状態まで作れると、「なんとなく動いていそうだからmainへ入れる」という開発からかなり離れられます。
AI開発ではPreview環境の価値がさらに高くなる
人間が1日に数回コードを変更する開発では、手動QAでも運用できるケースがあります。
しかし、AIエージェントが短時間に何度も実装・修正を繰り返すようになると、人間が毎回そのすべてをチェックするのは難しくなります。
そのとき重要なのが、
AIが実装
↓
Previewを自動生成
↓
E2Eで検証
↓
失敗
↓
AIが原因調査
↓
修正
↓
新しいPreview
↓
E2E再検証
↓
人間が最終承認
というループです。
OmochiX View
AI開発の速度を上げるだけでなく、「AIが何度失敗しても安全にやり直せるPreview+QA環境」を持つことが、今後の自動開発では重要になります。
最終的に目指す自動開発パイプライン
ここまでをつなぐと、自動開発環境は次のようになります。
Issue / Specification
↓
Claude Code
↓
Feature Branch
↓
GitHub
↓
Vercel Preview
↓
GitHub Actions
↓
Playwright E2E
↓
PASS ─────────→ Human Review → Merge
↓
FAIL
↓
Claude Code
↓
原因調査
↓
最小修正
↓
再Preview
↓
再E2E
ここまで来ると、Claude Codeは単なる「コードを書くAI」ではなく、検証環境の中で何度も実装・修正を繰り返せる開発エージェントとして使えるようになります。
3行まとめ
- Vercel PreviewへPlaywrightを実行すると、デプロイ後の実環境に近い状態でE2Eできる
- Preview DB・QA User・環境変数をProductionから分離することが重要
- テスト失敗をClaude Codeへ戻すことで、実装→検証→修正→再検証のループを作れる
次はQA専用DBまで自動化する
Preview環境でE2Eが動くようになったら、次に考えたいのがQAデータベースの自動管理です。
Previewが作られたらQA用DBを用意し、Seedデータを投入してPlaywrightを実行。テスト終了後は不要なデータを消す。
ここまでできれば、さらに再現性の高いQA環境へ進められます。
前の記事
Claude Code × GitHub Actions × Playwrightで自動QA環境を作る
Preview E2Eへ進む前に、GitHub ActionsとPlaywrightを使った基本のCI・E2E構成を確認したい方はこちら。
出典:Vercel公式ドキュメント / GitHub Actions公式ドキュメント / Microsoft Playwright公式ドキュメント