Claude Codeで機能実装が数十分で終わるようになっても、そのあと人間が毎回ブラウザを開いて「本当に動くか」を確認していたら、開発全体の速度はそこで止まります。
AI開発を次の段階へ進めるために必要なのが、実装だけではなく、テスト・E2E・失敗検知・原因調査までをつなげる仕組みです。
そこで今回作るのが、Claude Code × GitHub Actions × Playwrightを組み合わせた自動QA環境です。
コードをPushしたらGitHub Actionsが起動し、Lint・型チェック・Build・E2Eテストを実行。テストが失敗したらレポートやログを残し、Claude Codeで原因調査・修正につなげます。
この記事でわかること
- GitHub Actions・Playwright・Claude Codeそれぞれの役割分担
- Push・Pull Request後に自動QAを実行するworkflowの作り方
- Playwrightでログインやフォーム送信をE2Eテストする方法
- 失敗したCIをClaude Codeで調査する構成
- 本番を壊さないQA環境の設計ポイント
結論
自動QAの合否判定はGitHub ActionsとPlaywrightに任せ、Claude Codeは実装・失敗原因の調査・修正を担当させる。この役割分担を作ることで、AI開発を「コードを生成するだけ」から「検証まで回る開発フロー」へ進められます。
Claude Codeだけでは「自動開発」にならない
Claude Codeは、コードの実装・修正・調査・Git操作などをエージェント的に進められる強力な開発ツールです。
しかし、Claude Codeがコードを書いたからといって、その実装が必ず正しいとは限りません。
一見問題なく動いていても、別ページが壊れていたり、既存機能に回帰が発生したり、スマートフォンだけレイアウトが崩れたりする可能性があります。
AIによってコードを書く速度が上がるほど、重要になるのが「正しく動いているか」をAIとは別の仕組みで判定する品質ゲートです。
Key Point
AI自身に「自分が書いたコードは正しい」と判断させるのではなく、Lint・Build・Test・E2Eを客観的な合否基準として置くことが重要です。
GitHub Actions・Playwright・Claude Codeの役割
今回の構成では、3つのツールにそれぞれ違う役割を持たせます。
GitHub Actions
PushやPRをトリガーにCIを起動し、品質チェックを自動実行します。
- Lint・Typecheck・Build
- テストworkflowの実行
- Artifact・ログの保存
Playwright
実際のブラウザを操作し、ユーザー操作に近い形でE2Eを検証します。
- ログイン・フォーム操作
- 画面遷移の確認
- Trace・Screenshot取得
Claude Code
実装を進め、失敗したCIやテストの原因調査・修正を支援します。
- 機能実装・修正
- 失敗ログの解析
- 修正・再テスト
今回作る自動QA環境の全体像
基本的な流れは次の通りです。
-
1
Claude Codeで実装
機能追加・バグ修正・リファクタリングなどを進めます。
-
2
GitHubへPush
featureブランチやdevelopブランチへ変更をPushします。
-
3
GitHub Actionsが起動
Lint・型チェック・Unit Test・Buildなどを自動実行します。
-
4
PlaywrightでE2E
ブラウザを起動し、主要なユーザーフローを検証します。
-
5
失敗情報を保存
HTML Report・Trace・Screenshotなどを残します。
-
6
Claude Codeで原因調査
ログを確認し、問題を修正して再びQAを実行します。
まずPlaywrightを導入する
まだPlaywrightを入れていない場合は、プロジェクト内でセットアップします。
npm init playwright@latest
既存プロジェクトへ追加する場合は、プロジェクト構成に合わせて導入してください。
たとえば、次のような構成になります。
project/
├── app/
├── tests/
│ ├── login.spec.ts
│ ├── customer.spec.ts
│ └── form.spec.ts
├── playwright.config.ts
├── package.json
└── .github/
└── workflows/
└── qa.yml
Playwrightの設定を作る
CI環境では、ローカル開発以上にテストの再現性と安定性が重要です。
Playwright公式では、CIでは安定性を優先するためworkerを1にする構成が推奨されています。
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',
},
});
失敗時にTraceやScreenshotを残しておけば、「どの操作のあとに、何が壊れたのか」を追いやすくなります。
GitHub ActionsでQAを自動実行する
次に、GitHub Actionsのworkflowを作ります。
.github/workflows/qa.ymlを作成します。
name: QA
on:
pull_request:
branches:
- main
- develop
push:
branches:
- develop
permissions:
contents: read
jobs:
qa:
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: Lint
run: npm run lint --if-present
- name: Typecheck
run: npm run typecheck --if-present
- name: Unit tests
run: npm test --if-present
- name: Build
run: npm run build
- name: Install Playwright
run: npx playwright install --with-deps
- name: Run Playwright tests
run: npx playwright test
- name: Upload Playwright report
if: ${{ !cancelled() }}
uses: actions/upload-artifact@v5
with:
name: playwright-report
path: playwright-report/
retention-days: 30
プロジェクトごとに変更が必要
npm run build、npm run lint、npm run typecheckなどのscript名はプロジェクトによって異なります。必ず自分のpackage.jsonに合わせて調整してください。
Pushすると何が起きる?
このworkflowを導入すると、Pull Request作成やdevelopへのPushをきっかけにQAが自動実行されます。
-
1
Checkout
GitHub上のコードをCI環境へ取得します。
-
2
Static Check
Lint・Typecheck・Unit Testなどを実行します。
-
3
Build
アプリケーションが正常にBuildできるか確認します。
-
4
E2E
Playwrightが実際のブラウザ操作を自動実行します。
-
5
Report
実行結果やPlaywright Reportを保存します。
Playwrightで何をテストする?
最初からすべての画面をE2E化する必要はありません。
むしろ最初は、サービス提供・売上・顧客体験に直結する「壊れたら困るフロー」からテストする方が効果的です。
CRM・SaaSなら優先したいE2E
- ユーザーがログインできる
- 顧客や案件を登録できる
- 公開フォームを送信できる
- 見積・請求など重要処理が完了する
- 権限のないユーザーが管理画面へ入れない
ログインをE2Eテストする例
import { test, expect } from '@playwright/test';
test('ユーザーがログインできる', 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/);
});
Secretsをコードへ直書きしない
QA用メールアドレス・パスワード・APIキーなどは、テストコードへ直接書かず、GitHub Secretsなどから環境変数として渡します。
本番DBでE2Eを実行しない
自動QAで特に注意したいのが、テストデータと本番データの分離です。
CRMやSaaSのE2Eを本番環境へ直接実行すると、テスト顧客・テスト案件・テスト請求などが本番データへ混入する可能性があります。
推奨構成
ProductionとPreview / QAを分離し、QA専用DB・QA Tenant・QA Userを用意したうえでPlaywrightを実行します。
Production
├── Production DB
└── 実ユーザー
Preview / QA
├── QA DB
├── QA Tenant
├── QA User
└── Playwright E2E
OmochiX View
AI開発が進むほど「AIに何を任せるか」だけでなく、「AIが失敗しても本番を壊さない環境をどう作るか」が重要になります。
Vercel Previewに対してE2Eする
ローカルBuildだけでなく、実際にデプロイされたPreview環境をPlaywrightでテストする構成も作れます。
Playwright公式では、GitHubのdeployment_statusイベントを利用し、Deploymentがsuccessになったあとに対象URLへE2Eを実行する構成例も掲載されています。
Claude Code
↓
Git Push
↓
Vercel Preview Deploy
↓
Deployment Success
↓
GitHub Actions
↓
Playwright E2E
↓
PASS / FAIL
これによって、「ローカルでは動いたが、実際のPreview環境では壊れていた」といった問題も検出しやすくなります。
Preview URLを使った実装は次の記事でさらに詳しく解説します。
CIが失敗したらClaude Codeで解析する
ここからClaude CodeをQAフローへ組み込みます。
AnthropicのClaude Code Actionでは、GitHub Actionsへのactions: read権限を付与することで、workflowの実行状態・job log・CI statusをClaudeが参照できます。
workflow側では、必要な権限を設定します。
permissions:
contents: write
pull-requests: write
issues: write
actions: read
Claude Code Action側でも追加権限を指定します。
- uses: anthropics/claude-code-action@v1
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
additional_permissions: |
actions: read
この構成にすると、Claudeに「なぜCIが失敗した?」「Playwrightの失敗ログを調べて」といった形で原因調査を依頼できます。
テストとAIの役割を逆にしない
AI自動開発で重要なのは、Claude Code自身を「テストの正解判定役」にしないことです。
CI
コードが機械的な品質基準を通過しているか確認します。
- Lint
- Typecheck
- Build / Test
E2E
実際の利用フローが壊れていないかブラウザで検証します。
- 画面遷移
- フォーム操作
- ユーザーフロー
AI
テスト結果を読み、問題を解決する側を担当します。
- 原因調査
- 修正案
- コード修正
重要
テストを「正解の基準」にして、AIはその基準を通過するための実装・修正を担当する。この順番を守ることが、自動開発環境を安定させるポイントです。
Claude Codeに修正まで任せられる?
技術的には、失敗したCIを読み、Claude Codeにコード修正まで進めさせる構成も可能です。
ただし最初から完全自動化する必要はありません。
まずは次の流れを安定させる方が安全です。
-
1
CIで自動テスト
コード変更を機械的に検証します。
-
2
失敗情報を保存
ログ・Trace・Screenshotなどを残します。
-
3
Claude Codeで解析
CIとE2Eの失敗原因を調べます。
-
4
修正
必要なコード変更を実行します。
-
5
再検証
再びGitHub ActionsとPlaywrightを実行します。
最初からmainへ自動マージしない
AIがテストを通過させたからといって、最初からmainブランチへ完全自動でマージする設計にする必要はありません。まずはPull Requestと人間の最終レビューを品質ゲートとして残す方が安全です。
GitHub Actionsの権限は最小限にする
GitHub Actionsではpermissionsを使って、workflowやjob単位でGITHUB_TOKENの権限を指定できます。
QAを実行するだけなら、まずはread中心の最小権限から始めます。
permissions:
contents: read
Claude Code Actionなど、書き込みが必要な処理を追加するときだけ、そのworkflowに必要な権限を追加します。
特に外部ForkからのPull RequestやSecretsを扱うworkflowでは、権限の与えすぎに注意してください。
AI自動開発で重要なのは「品質ゲート」
Claude Code・Codex・Cursorなどによって、コードを書く速度は今後さらに上がっていきます。
しかし、コード生成だけ高速化しても、その後の確認作業がすべて人間のままなら、開発全体の自動化には限界があります。
AIが実装
↓
CIが検証
↓
E2Eがユーザーフローを確認
↓
失敗したらAIが調査
↓
AIが修正
↓
再検証
↓
人間が最終レビュー
このループができると、人間は毎回同じ確認を繰り返すのではなく、仕様判断・例外判断・最終承認など、より重要な部分へ集中しやすくなります。
3行まとめ
- GitHub ActionsでPush・PR後のLint・Build・Testを自動化できる
- Playwrightを加えると実際のブラウザ操作までE2E検証できる
- Claude Codeはテストの代わりではなく、失敗解析・修正を高速化する役割で使う
次はVercel Previewまでつなぐ
今回の構成だけでも、コード変更後のQAはかなり自動化できます。
次のステップは、実際に発行されたVercel Preview URLを取得し、その環境に対してPlaywrightを自動実行することです。
Claude Code
↓
GitHub
↓
Vercel Preview
↓
Playwright E2E
↓
PASS / FAIL
↓
Claude Codeで原因調査・修正
↓
再検証
ここまでつながると、AIによる実装からPreview環境での検証までを、一連のパイプラインとして扱えるようになります。
次に読む
Claude Code × Playwright MCP完全ガイド
Claude Codeからブラウザを操作し、画面確認・フォーム操作・E2Eテストを進める方法をMCP接続から詳しく解説しています。
出典:Anthropic Claude Code Action公式ドキュメント / GitHub Actions公式ドキュメント / Microsoft Playwright公式ドキュメント