Skip to content

E2E テスト概要

20.5.1. フレームワーク選択

E2E テストフレームワークとして Playwright を使用することを推奨します。

項目PlaywrightCypress
ブラウザサポートChromium、Firefox、WebKitChromium、Firefox、WebKit(実験的)
実行速度高速(並列実行をデフォルトサポート)普通(並列実行には有料プランが必要)
マルチタブ/ウィンドウサポート未サポート
iframe サポートネイティブサポート限定的
API テスト内蔵サポートプラグインが必要
デバッグツールTrace Viewer、CodegenCypress Runner
言語サポートTypeScript、JavaScript、Python、Java、.NETTypeScript、JavaScript
  • Playwright はマルチブラウザテスト、並列実行、API テストをデフォルトでサポートするため、TQS 基準の推奨フレームワークです。
  • Cypress を既に使用中のプロジェクトは移行を強制しませんが、新規プロジェクトでは Playwright を採用します。

20.5.2. コアシナリオ

E2E テストはユーザーのコア業務フローを検証します。以下のシナリオは必須テスト対象です。

シナリオ検証項目
ログイン/ログアウト正常ログイン、不正な資格情報の処理、ログアウト後のリダイレクト
CRUD フロー項目作成、一覧表示、詳細表示、編集、削除
エラー処理404 ページ、サーバーエラー時のユーザーフィードバック、ネットワークエラーの復旧
権限制御未認証ユーザーのアクセス遮断、権限別メニュー/機能の表示
フォーム送信バリデーション、二重送信防止、成功/失敗フィードバック
typescript
// e2e/auth.spec.ts
import { test, expect } from '@playwright/test'

test.describe('認証フロー', () => {
  test('正常ログイン後にダッシュボードへ遷移しなければなりません', async ({ page }) => {
    await page.goto('/login')
    await page.fill('[data-testid="input-email"]', 'user@example.com')
    await page.fill('[data-testid="input-password"]', 'password123')
    await page.click('[data-testid="btn-login"]')

    await expect(page).toHaveURL('/dashboard')
    await expect(page.locator('[data-testid="user-greeting"]')).toBeVisible()
  })

  test('不正なパスワード時にエラーメッセージを表示しなければなりません', async ({ page }) => {
    await page.goto('/login')
    await page.fill('[data-testid="input-email"]', 'user@example.com')
    await page.fill('[data-testid="input-password"]', 'wrong')
    await page.click('[data-testid="btn-login"]')

    await expect(page.locator('[data-testid="error-message"]')).toBeVisible()
  })
})
  • すべてのコアシナリオに対して正常パスと例外パスの両方をテストします。
  • テストシナリオはユーザーストーリーまたは要件ドキュメントとマッピングして管理します。

20.5.3. テスト作成原則

ユーザー視点テスト

E2E テストは内部実装ではなく、ユーザーが見て操作する要素を基準に作成します。

  • CSS クラス名やコンポーネント内部状態に依存しません。
  • data-testid 属性を使用してテスト対象要素を選択します。
  • data-testid 命名規則:{要素タイプ}-{説明}(例:btn-submitinput-emaillist-users

フレーキーテスト防止

不安定な(flaky)テストは信頼性を低下させるため、以下の原則を遵守します。

  • 固定待機時間(waitForTimeout)の代わりに条件ベースの待機(waitForSelectorexpect().toBeVisible())を使用します。
  • テストデータは各テストで独立して作成し、クリーンアップします。
  • 外部 API 依存性は可能な限りモックサーバーで代替します。
  • ネットワークリクエストの完了を waitForResponse() で明示的に待機します。

20.5.4. CI 連携

CI 環境で E2E テストを自動実行するための設定です。

typescript
// playwright.config.ts
import { defineConfig } from '@playwright/test'

export default defineConfig({
  testDir: './e2e',
  fullyParallel: true,
  retries: process.env.CI ? 2 : 0,
  workers: process.env.CI ? 1 : undefined,
  use: {
    baseURL: 'http://localhost:3000',
    trace: 'on-first-retry',
    screenshot: 'only-on-failure',
    video: 'on-first-retry',
  },
  webServer: {
    command: 'yarn dev',
    port: 3000,
    reuseExistingServer: !process.env.CI,
  },
})
設定項目CI 環境値説明
retries2失敗時に最大 2 回リトライ
workers1安定性のためにシリアル実行
screenshotonly-on-failure失敗時にスクリーンショットを自動保存
videoon-first-retry最初のリトライ時にビデオ録画
traceon-first-retry最初のリトライ時に Trace ファイルを保存
  • CI 環境では headless モードで実行します(Playwright デフォルト)。
  • 失敗時に生成されるスクリーンショット、ビデオ、Trace ファイルは CI アーティファクトとして保管します。
  • webServer 設定を通じてテスト前に開発サーバーを自動起動します。
  • リトライ回数は CI でのみ有効化し、ローカル開発時には即座に失敗を確認します。

TIENIPIA QUALIFIED STANDARD