私のQAエンジニアはLLMです

Claudeはボタンをクリックできます。

些細なことのように聞こえますが、UIの構築方法を変えます。Playwright MCPを使うと、Claudeは単にコードを書くだけでなく、ブラウザを開き、localhostに移動し、実際に動作することを検証します。コードレビューで見逃すバグを発見します。

セットアップ

Playwright MCPはClaudeにブラウザ自動化を提供します。ヘッドレスChromiumで実行しています:

{
  "mcpServers": {
    "playwright": {
      "command": "npx",
      "args": ["@anthropic-ai/mcp-server-playwright", "--headless"]
    }
  }
}

これでClaudeはナビゲート、クリック、タイプ、スクリーンショットができます。ユーザーが見るものを見ます。

flowchart LR
    Claude([Claude Code]) -->|browser_snapshot| PW[Playwright MCP]
    PW --> Browser[Headless Chrome]
    Browser --> App[localhost:1313]
    Browser -.->|screenshot| Issue[(GitHub Issue)]
    Issue -.->|visual history| PR[Pull Request]
flowchart TB
    Claude([Claude Code]) -->|browser_snapshot| PW[Playwright MCP]
    PW --> Browser[Headless Chrome]
    Browser --> App[localhost:1313]
    Browser -.->|screenshot| Issue[(GitHub Issue)]
    Issue -.->|visual history| PR[Pull Request]

フロー: Claude Code → Playwright MCP → ブラウザ → スクリーンショット → GitHub Issues → PR

ビューポートマトリックス

すべてのUI変更は3つのブレークポイントでテストされます:

ビューポートサイズ理由
Desktop1440×900標準的なラップトップ
Tablet1024×768iPad縦向き
Mobile390×844iPhone 14

Claudeはブラウザをリサイズし、スクリーンショットを撮り、GitHub Issueにアップロードします。状態変更ごとに3つのスクリーンショット。モバイルナビゲーションが壊れている場合、デプロイ後ではなく、すぐに確認できます。

テーマテスト

ライトモードとダークモードでも同じパターン:

// Claudeがテーマを切り替える
await page.click('[data-testid="theme-toggle"]');
// 両方の状態をスクリーンショット

CSS変数の一貫性が重要です。ライトモードで見栄えが良いコンポーネントが、ダークモードでは見えないテキストを持っている可能性があります。Claudeは実際に両方を見ることでこれを検出します。

インタラクティブテスト

ここが面白いところです。Claudeは単にスクリーンショットを撮るだけでなく、UIを使用します:

バグを見つけたとき—たとえば、外側をタップしてもドロワーが閉じない—それを報告し、コードを修正し、再テストします。フィードバックループは短いです。

テストレポートとしてのGitHub Issue

すべてのスクリーンショットはGitHub Issueにアップロードされます。各マイルストーンでIssue本文が再構築されます:

## 現在の状態

### Desktop (1440×900)
![desktop](https://user-images.githubusercontent.com/...)

### Tablet (1024×768)
![tablet](https://user-images.githubusercontent.com/...)

### Mobile (390×844)
![mobile](https://user-images.githubusercontent.com/...)

## テストチェックリスト
- [x] ナビゲーションリンクが機能
- [x] モバイルドロワーが開く/閉じる
- [x] テーマ切り替えが保持される
- [ ] フォーム検証がエラーを表示

Issueは生きたテストレポートになります。PRをレビューする人は、何がテストされたか正確に確認できます。

完全なループ

典型的な機能はこのサイクルを経ます:

  1. Issue作成: 「サイドバーナビゲーションを追加」
  2. Claude実装: コンポーネントを記述
  3. ビジュアル検証: すべてのビューポートのスクリーンショット
  4. インタラクティブテスト: UIをクリックスルー
  5. バグ発見: 背景クリックでドロワーが閉じない
  6. 修正適用: クリックハンドラーを更新
  7. 再テスト: 新しいスクリーンショット、すべて合格
  8. PR作成: 完全なビジュアル履歴を持つIssueにリンク

手動QAステップなし。実際に見ずに「良さそう」もなし。Claudeは自分の仕事を検証します。

これが検出するもの

Claudeが見つけた実際のバグ:

これらは、ブラウザでのみ現れるためコードレビューをすり抜けるバグです。Claudeは実際にコードを実行するため、それらを発見します。

すべてのPRには、動作することの証拠が付いてきます。