E2E テスト

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

テスト品質

E2E テストとは

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

テストピラミッド

テストピラミッドを図で示す。

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

Playwright での 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 での実行

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 を使う。テストデータの依存にはテストごとにデータをリセットする。ネットワーク遅延にはモックサーバーを使う。

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

この記事は役に立ちましたか?

関連用語

関連する記事