手動テストで消耗するな:PlaywrightによるE2E自動化とCI/CDパイプライン構築の全技術

手動テストで消耗するな:PlaywrightによるE2E自動化とCI/CDパイプライン構築の全技術

「リリース前の画面ポチポチ」に、あと何時間ドブに捨てる気だ?

デプロイボタンを押す直前、震える手でログイン画面を確認し、カートに商品を入れて決済フローを確認する。そんな作業を繰り返している間に、コードの価値は陳腐化し、お前の貴重な脳のリソースは浪費されている。

俺もかつてはそうだった。「テストコードを書く余裕がない」という死のループに陥り、深夜のデプロイでバグを仕込んで青ざめる日々。だが、Playwrightを導入してからは景色が変わった。今回は、泥臭い手動テストから脱却し、CI/CDで「寝ている間に品質が担保される」環境を作るための、実戦的な勘所を共有する。


1. 認証の「思考停止」を捨て、状態を再利用せよ

多くのエンジニアが犯す最大の過ちは、すべてのテストケースで「ログイン」から書き始めることだ。これではテスト実行時間が線形に増大し、結果として誰もテストを回さなくなる。

`storageState`を使い、ブラウザのCookieとLocalStorageを保存・ロードするのが鉄則だ。

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

export default defineConfig({
  use: {
    // 認証済み状態を再利用
    storageState: 'playwright/.auth/user.json',
  },
});

⚠️ セキュリティへの注意喚起

`storageState`に保存されるJSONには、セッション情報やトークンが含まれる。絶対にGitの管理下に置くな。 `.gitignore`に`.auth/`を追加し、CI環境ではログインテストを一度だけ実行してArtifactとして受け渡す運用が必須だ。トークンの期限切れ(リフレッシュ戦略)については、テスト開始時に`globalSetup`でログインチェックを走らせる実装を推奨する。

2. 「待ち」のコードを捨て、宣言的に記述する

`page.waitForTimeout(3000)`と書いた瞬間、そのテストコードは「ゴミ」に成り下がる。ネットワークの揺らぎやレンダリングの遅延を「祈り」で解決しようとするな。

Playwrightの強力なオートウェイトを信じろ。

// 悪い例:3秒待つという「祈り」
await page.waitForTimeout(3000);
await page.click('.submit-btn');

// 良い例:状態が変わるまで待機する「宣言」
const button = page.locator('.submit-btn');
await expect(button).toBeVisible();
await button.click();

人間が「これくらい待てばいい」と考えるのは、計算機科学の観点から見れば極めて非論理的だ。要素の出現、非表示、ネットワークのアイドル状態をトリガーにすべきだ。


3. CI環境の「罠」:環境差分をコードで埋める

ローカルで動くのにGitHub Actionsで落ちる。この現象の正体は、ほとんどの場合「環境の不一致」だ。タイムゾーン、スクリーンサイズ、フォントのレンダリング。これらを放置しているなら、お前のCIはテストではなく「ガチャ」を回しているに過ぎない。

# .github/workflows/playwright.yml
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run Playwright
        run: npx playwright test
        env:
          TZ: Asia/Tokyo # タイムゾーン固定
          CI: true
      - name: Upload Report
        if: always() # 失敗してもレポートを保存
        uses: actions/upload-artifact@v4
        with:
          name: playwright-report
          path: playwright-report/
          retention-days: 7

失敗時のトレースを捨ててはいけない。 `playwright-report`には、失敗した瞬間のDOMスナップショットや動画が記録される。これがあれば、深夜のデバッグで「なぜ落ちた?」と悩む時間はゼロになる。


4. 成長のための「次のステップ」

テスト自動化は、単なる作業効率化ではない。「バグを恐れず、大胆にリファクタリングする権利」を手に入れるための投資だ。

今のコードにテストがないのなら、まずは「ログインしてマイページに遷移する」というたった1つのケースから始めろ。完璧を目指す必要はない。昨日より1つだけ、自動化された箇所が増えればいい。

学習リソース

お前が手動テストに費やしている時間は、本来、新しい機能を実装したり、アーキテクチャを磨くためにあるはずだ。機械に任せられることは機械に譲り、お前は「人間にしかできない創造的な設計」に脳を使え。

明日から手動テストで消耗するのはやめろ。コードで眠れ。