Playwright認証テスト完全ガイド|storageState・Basic認証・OAuth・MFAまで網羅
E2Eテストで最もつまずきやすいのが「認証の壁」です。テストケースごとにログイン操作を繰り返すと実行時間が膨れ上がり、MFA(多要素認証)やOAuth連携が絡むとテストコード自体の設計が難しくなります。 Playwrightには storageState やセットアッププロジェクトといった認証テスト向けの機能が組み込まれており、一度の認証操作で取得したブラウザ状態を複数テストへ再利用できます。 ここでは、Basic認証・フォームログイン・OAuth/SSO・2段階認証(MFA)それぞれのパターンについて、Playwrightでの具体的な実装手順をコード付きで整理します。 PlaywrightのstorageStateによる認証状態の保存と再利用 Playwrightの storageState は、CookieとローカルストレージをJSONファイルへ書き出し、別のテストで読み込める仕組みです。ログイン操作を「セットアッププロジェクト」として1回だけ実行し、その結果をすべてのテストで共有することで、テスト全体の実行時間を大幅に短縮できます。 ディレクトリの準備 まず認証状態ファイルの保存先を用意します。 mkdir -p playwright/.auth echo "playwright/.auth" >> .gitignore .gitignore への追加は必須です。認証状態ファイルにはCookieやセッショントークンが含まれるため、リポジトリにコミットするとセキュリティリスクとなります。 auth.setup.tsの記述 tests/auth.setup.ts を作成し、ログイン操作と状態保存を記述します。 // tests/auth.setup.ts import { test as setup, expect } from '@playwright/test'; const authFile = 'playwright/.auth/user.json'; setup('ログイン処理', async ({ page }) => { // ログインページへ遷移 await page.goto('/login'); // フォーム入力 await page.getByLabel('メールアドレス').fill('test@example.com'); await page.getByLabel('パスワード').fill('secure-password'); await page.getByRole('button', { name: 'ログイン' }).click(); // 認証完了の確認(リダイレクト先URLやDOM要素で判定) await page.waitForURL('/dashboard'); await expect(page.getByText('ダッシュボード')).toBeVisible(); // ブラウザ状態を保存 await page.context().storageState({ path: authFile }); }); waitForURL での認証完了の確認は重要です。OAuth連携などではリダイレクトが複数回発生するため、最終URLに到達してからCookieが確定します。 playwright.config.tsの設定 セットアッププロジェクトを定義し、他のテストプロジェクトがその完了を待つように依存関係を組みます。 // playwright.config.ts import { defineConfig, devices } from '@playwright/test'; export default defineConfig({ projects: [ // セットアップ:認証処理を1回だけ実行 { name: 'setup', testMatch: /.*\.setup\.ts/, }, // テスト本体:セットアップ完了後に実行 { name: 'chromium', use: { ...devices['Desktop Chrome'], storageState: 'playwright/.auth/user.json', }, dependencies: ['setup'], }, { name: 'firefox', use: { ...devices['Desktop Firefox'], storageState: 'playwright/.auth/user.json', }, dependencies: ['setup'], }, ], }); dependencies: ['setup'] がポイントです。Playwrightはこの設定を見て、setup プロジェクトの完了後にテスト本体を実行します。 ...