E2E テスト実行手順書¶
概要¶
本ドキュメントは、会計システムのフロントエンド E2E(End-to-End)テストの実行方法を説明します。
E2E テストは Cypress を使用し、MSW(Mock Service Worker)によるモック API を使用することで、バックエンドサーバーなしでテストを実行できます。
技術スタック¶
| カテゴリ | 技術 | 用途 |
|---|---|---|
| E2E テスト | Cypress | ブラウザ自動テスト |
| API モック | MSW | Service Worker によるリクエスト傍受 |
| 環境変数 | cross-env | クロスプラットフォーム対応 |
前提条件¶
- Node.js 20 以上
- npm 10 以上
- フロントエンドの依存関係がインストール済み(
npm install)
ディレクトリ構成¶
apps/frontend/
├── cypress/
│ ├── e2e/ # E2E テストファイル
│ │ ├── auth/
│ │ │ └── login.cy.ts # 認証テスト
│ │ └── sample.cy.ts # サンプルテスト
│ ├── support/
│ │ ├── commands.ts # カスタムコマンド
│ │ └── e2e.ts # E2E サポート設定
│ └── tsconfig.json # Cypress 用 TypeScript 設定
├── public/
│ └── mockServiceWorker.js # MSW Service Worker(自動生成)
├── src/
│ └── mocks/
│ ├── browser.ts # MSW ブラウザ設定
│ └── handlers.ts # モックハンドラー定義
└── cypress.config.ts # Cypress 設定
実行方法¶
1. MSW 有効モードで開発サーバーを起動¶
cd apps/frontend
npm run dev:e2e
このコマンドは VITE_ENABLE_MSW=true 環境変数を設定して Vite を起動します。MSW が有効になり、API リクエストがモックされます。
2. E2E テストを実行¶
ヘッドレスモード(CI 向け)¶
npm run e2e
# または
npm run cypress:run
インタラクティブモード(開発向け)¶
npm run e2e:open
# または
npm run cypress
3. ワンコマンド実行(開発サーバー + テスト)¶
開発サーバーとテストを別々のターミナルで実行する場合:
ターミナル 1:
npm run dev:e2e
ターミナル 2:
npm run e2e
MSW モックハンドラー¶
認証モック¶
src/mocks/handlers.ts に定義されたモックハンドラー:
| ユーザー名 | パスワード | 結果 |
|---|---|---|
admin |
Password123! |
ADMIN ロールでログイン成功 |
user |
Password123! |
USER ロールでログイン成功 |
locked |
任意 | アカウントロックエラー |
inactive |
任意 | アカウント無効化エラー |
| その他 | 任意 | 認証エラー |
モックトークン¶
MSW は有効な JWT 形式のトークンを返します。これにより、ページリロード後も認証状態が維持されます。
// トークン生成関数
const createMockJwt = (sub: string, expiresInSeconds = 3600): string => {
const header = btoa(JSON.stringify({ alg: 'HS256', typ: 'JWT' }));
const payload = btoa(
JSON.stringify({
sub,
exp: Math.floor(Date.now() / 1000) + expiresInSeconds,
iat: Math.floor(Date.now() / 1000),
})
);
const signature = 'mock-signature';
return `${header}.${payload}.${signature}`;
};
テストケース¶
認証テスト(cypress/e2e/auth/login.cy.ts)¶
US-AUTH-001: ログイン¶
| テストケース | 説明 |
|---|---|
| 正しい認証情報でログインできる | admin/Password123! でログイン成功 |
| 間違った認証情報でログインするとエラーが表示される | 不正なパスワードでエラー表示 |
| ユーザー名が空の場合はバリデーションエラーが表示される | 必須チェック |
| パスワードが空の場合はバリデーションエラーが表示される | 必須チェック |
| パスワードが8文字未満の場合はバリデーションエラーが表示される | 長さチェック |
| 未認証状態で保護されたページにアクセスするとログインページにリダイレクトされる | ルートガード |
| ログイン成功後、JWT トークンがローカルストレージに保存される | トークン永続化 |
| 一般ユーザーでログインできる | user/Password123! でログイン成功 |
US-AUTH-002: ログアウト¶
| テストケース | 説明 |
|---|---|
| ログアウトボタンをクリックするとログアウトできる | ログアウト動作 |
| ログアウト後、ローカルストレージから認証情報がクリアされる | トークン削除 |
| ログアウト後、保護されたページにアクセスするとログインページにリダイレクトされる | セッション終了 |
認証状態の維持¶
| テストケース | 説明 |
|---|---|
| ログイン後、ページをリロードしても認証状態が維持される | セッション永続化 |
| ログイン済みの状態でログインページにアクセスするとダッシュボードにリダイレクトされる | 認証済みリダイレクト |
カスタムコマンド¶
cypress/support/commands.ts に定義されたカスタムコマンド:
// ログイン
cy.login(username, password)
// ログアウト
cy.logout()
// 認証情報クリア
cy.clearAuth()
トラブルシューティング¶
MSW Service Worker が登録できない¶
[MSW] Failed to register the Service Worker
解決方法:
npx msw init public/ --save
Windows で環境変数が認識されない¶
'VITE_ENABLE_MSW' は、内部コマンドまたは外部コマンドとして認識されていません
解決方法:
cross-env パッケージを使用する(package.json で設定済み)
テストがタイムアウトする¶
- 開発サーバーが起動しているか確認
baseUrlが正しいポートを指しているか確認
# デフォルトポート確認
curl http://localhost:3000
CI/CD 統合¶
GitHub Actions での実行例:
- name: Install dependencies
run: npm ci
working-directory: apps/frontend
- name: Start dev server
run: npm run dev:e2e &
working-directory: apps/frontend
- name: Wait for server
run: npx wait-on http://localhost:3000
- name: Run E2E tests
run: npm run e2e
working-directory: apps/frontend