E2E テスト

ユーザーの操作をブラウザ上で再現し、システム全体の動作を検証するテスト手法

テスト品質

E2E テストとは

E2E テスト (End-to-End Test) は、ユーザーの操作をブラウザ上で再現し、フロントエンドからバックエンド、データベースまでシステム全体の動作を検証するテスト手法である。「ユーザーがログインして商品を購入できるか」のようなシナリオを自動化する。

テストピラミッド

        /  E2E  \        ← 少数、遅い、高コスト
       / 結合テスト \
      / 単体テスト    \    ← 多数、速い、低コスト
レベル 速度 信頼性 コスト
単体テスト 最速 低い (モック) 低い 多い
結合テスト 中程度 中程度 中程度 中程度
E2E テスト 遅い 高い (実環境) 高い 少ない

Playwright での E2E テスト

import { test, expect } from '@playwright/test';

test('ユーザーがログインできる', async ({ page }) => {
  await page.goto('/login');
  await page.fill('[name="email"]', 'alice@example.com');
  await page.fill('[name="password"]', 'password123');
  await page.click('button[type="submit"]');

  await expect(page).toHaveURL('/dashboard');
  await expect(page.locator('h1')).toHaveText('Dashboard');
});

test('商品を検索して詳細を表示', async ({ page }) => {
  await page.goto('/');
  await page.fill('[name="search"]', 'TypeScript');
  await page.click('button[aria-label="検索"]');

  await expect(page.locator('.product-card')).toHaveCount(3);
  await page.click('.product-card >> nth=0');
  await expect(page.locator('h1')).toContainText('TypeScript');
});

ツール比較

Playwright はマルチブラウザ対応で自動待機と高速実行が特徴。Cypress は DX が良いがシングルブラウザ。Puppeteer は Chrome 専用で低レベル API を提供する。

CI での実行

# GitHub Actions
- uses: actions/checkout@v4
- run: npm ci
- run: npx playwright install --with-deps
- run: npx playwright test
- uses: actions/upload-artifact@v4
  if: failure()
  with:
    name: playwright-report
    path: playwright-report/

E2E テストの書き方のコツ

ユーザーの行動シナリオを書き、実装の詳細をテストしない。data-testid で要素を特定し、CSS クラス名での特定は避ける。重要なフローだけ E2E にし、全てを E2E でカバーしようとしない。自動待機 (Playwright) を活用し、sleep でタイミングを合わせない。

フレイキーテスト (不安定なテスト)

E2E テストは環境依存で不安定になりやすい。タイミング問題には自動待機や waitFor を使う。テストデータの依存にはテストごとにデータをリセットする。ネットワーク遅延にはモックサーバーを使う。

さらに掘り下げるなら関連書籍が参考になる。

関連用語