使い方 / 2026-10-20

2026 Playwrightメール認証E2Eテスト:実メール受信、インターセプト、それともAPI?

登録やパスワード再設定のメール認証をPlaywrightで検証する際、実メール受信・インターセプト・テストAPIのどれを選ぶべきかを整理します。確認できる範囲、待機の設計、CIでの使い分けを比較し、テストの目的に合う構成を選べます。

登録テストのたびに確認メール待ちで失敗し、原因が画面なのかメールなのか切り分けられません。
【判断】実際の配信経路を確かめるなら実メール受信、アプリの処理を安定して回帰確認するなら送信のインターセプト、本文やリンクを細かく検証するならテスト専用APIを選びます。すべてを一つのテストに詰め込まず、リスクに必要な最小の方法を使い分けてください。

QA自動化エンジニア:確認コードのメールでE2Eテストが不安定になる問題を減らしたい方。
メール機能の開発者:テスト用の仕組みが実際の配信経路のどこを省くか確認したい方。
CI担当者:高速な回帰テストと、実送信を含む確認を分けたい方。

まず、テストで証明する範囲を決めます

Playwrightのメール認証テストを設計するときは、「登録画面で送信操作ができた」「生成されたメールの内容が正しい」「受信側まで実際に届いた」を別々の確認項目にします。画面上に送信完了の表示が出ても、受信先にメールが届いた証拠にはなりません。一方、メールを読み取れても、すべての受信環境で配信が成功する証明にはなりません。

最初にテスト対象を次のように分けると、過剰な待ち時間や誤った失敗判定を避けやすくなります。

方法 主に証明できること 現実の配信経路 安定性・待ち時間 適した用途
実メール受信 実際に送信されたメールを受け取れること 広く確認できるが、外部メールサービスや受信環境に依存 外部遅延の影響を受ける 定期的な配信確認、リリース前の端から端までの確認
送信のインターセプト アプリが作った宛先・本文・リンク 通常は実際のメール配信を通らない 速く、制御しやすい 高頻度の回帰、メール内容の確認
テスト専用API テスト環境に保存されたメール情報 APIの設計と保存方法に依存 自動断言に向くが、専用実装が必要 件名・本文・リンク・トークンの検証

実メール受信はメールサービスや受信環境まで含めて確認できますが、遅延の原因をアプリだけに帰属できません。インターセプトとAPIはアプリ内部の検証を安定させやすい反面、実際の配送完了を保証しない方法です。

4つの指標で方式を絞ります

方式を比べるときは、実配信への近さだけでなく、CIで失敗した際の原因特定と保守負担も見ます。たとえば、テンプレート修正を毎回外部メールの到着待ちに結びつけると、アプリの変更と受信環境の一時的な遅れを区別しにくくなります。

判断指標 実メール受信 送信のインターセプト テスト専用API
真正性 高い。実際の受信まで確認 低め。送信内容の生成が中心 中程度。保存された情報の設計次第
実行の安定性 外部要因で揺れやすい 制御しやすい APIの可用性とテストデータの分離次第
待機の負担 到着を待つ必要がある 通常は短い メール登録を待つ仕組み次第
保守コスト テスト用受信先や障害切り分けが必要 送信経路の差し替え設定が必要 テスト用インターフェースの設計・保護が必要

判断に迷ったら、高頻度の回帰テストにはインターセプトかAPIを使い、実送信の確認は少数の統合テストやリリース前チェックに分けます。テストメールAPIは、本文や確認リンクを機械的に検査したいときに役立ちますが、すべてのメール基盤に共通のAPIがあるわけではありません。インターフェースの有無、テスト環境限定の認証、データの保存範囲はプロジェクトごとに確認してください。

次に、テスト段階ごとの構成を決めます

マイルストーン 確認する内容 推奨する方法 失敗時に調べる範囲
開発中の高速回帰 宛先、件名、本文、リンク生成 インターセプトまたはテストAPI アプリのメール生成処理
CIの統合確認 メールから認証画面までの遷移 テストAPI、必要に応じて実メール API・認証処理・テスト環境設定
リリース前の配信確認 実際の送信と受信 隔離したテスト用受信先で実メール受信 メールサービス、受信環境、アプリ

この分け方なら、すべての回帰テストに実メールを使う必要はありません。反対に、インターセプトだけで実送信も確認できたと扱うことも避けられます。

Playwrightの通信インターセプトで確認できる境界

Playwrightのネットワークリクエストを扱う公式機能は、ブラウザーが行う通信を監視・変更するためのものです。アプリが外部のメール送信APIを呼び出す構成なら、そのブラウザー通信をテスト内で扱える場合がありますが、SMTPによるサーバー側の送信や受信先への配達を自動で代替する機能ではありません。

インターセプトを選ぶ場合は、テスト環境だけで送信先や送信処理を差し替え、開発・本番環境へテスト用の宛先が流れない設定を確認します。Playwrightのfixtureとテスト環境の組み立て方も参照し、テストごとに必要な依存関係を分離してください。

注意:本番向けのメール送信設定をテスト用に流用しないでください。環境変数やメール送信先を分け、テストデータが実ユーザーへ届かないことを確認してから実行します。

登録確認コードのメールはどう待つか

Playwright E2Eメールテストでは、固定時間のスリープを既定の同期方法にせず、「メールが読める」「認証リンクを開いた後に状態が変わる」という期待状態を待ちます。Playwrightの非同期アサーションは期待する状態を一定時間再試行します。公式資料では、アサーションの既定タイムアウトは5秒とされています。実行環境に合わせて必要な場合だけ調整し、固定の待機時間でメール到着を決めつけないでください。

// readTestMail はプロジェクト側で実装するメール取得処理です。
// Playwrightに共通のメールボックス読み取り機能がある、という意味ではありません。
await page.getByLabel("メールアドレス").fill(testAddress);
await page.getByRole("button", { name: "登録" }).click();

const message = await readTestMail({
  recipient: testAddress,
  subject: "メールアドレスの確認",
});

expect(message.text).toContain("確認");
expect(message.text).toContain(message.confirmationUrl);

await page.goto(message.confirmationUrl);
await expect(page.getByText("メールアドレスを確認しました")).toBeVisible();

readTestMailは、実際のプロジェクトで選んだ受信先やAPIに合わせて用意します。メールを取得する処理側にも待機や期限を設け、メールが見つからない場合は「送信されなかった」のか「受信が遅れた」のか判別できる情報を残します。Playwrightのテストタイムアウト設定ではテスト全体の既定タイムアウトが30秒です。メール待ちだけで上限を使い切らないよう、メール取得処理と画面アサーションの待ち時間を分けて設計してください。

偶発失敗を減らす5つの実装手順

  1. 検証目的を1つに絞ります。 送信内容の回帰なのか、受信先までの配送確認なのかをテスト名と説明に明記します。
  2. テスト専用の宛先を用意します。 実ユーザーや同僚のメールアドレスを使わず、テストデータと実利用データを分けます。テスト用メールアドレスの運用は、自社サービスの登録テストに使う受信先の考え方も参考になります。
  3. メールの取得手段を明示します。 インターセプト、API、実メールのどれを使うか決め、Playwrightの標準機能とプロジェクト独自の処理を混同しません。
  4. 固定スリープではなく状態を待ちます。 メール取得処理で対象の宛先・件名を特定し、認証画面ではPlaywrightのアサーションで完了状態を確認します。
  5. 失敗ログを分けて残します。 送信要求の有無、取得したメールの有無、リンクを開いた後の画面状態を別々に記録すると、原因を切り分けやすくなります。

Playwrightのブラウザーコンテキストによる分離では、テストごとに独立したブラウザー環境を用意できます。ただし、受信メールやテストAPIの保存データまで自動的に分離されるわけではありません。メール側でもテストごとの宛先や識別子を使い、同時実行時に別テストのメールを拾わないようにしてください。認証コードを含む自動化テストのタイムアウトを調べる際は、メール確認テストの待機と切り分け方の観点も役立ちます。

登録やパスワード再設定に使う一時的な受信先が必要なら、独立したテスト用アドレスを使う方法もあります。実メールで配信まで見るテストと、APIやインターセプトで高速に回す回帰テストを分けたうえで、必要なときはtmponeの一時受信箱をテスト用の選択肢として検討してください。銀行・決済・行政など長期的な本人確認やアカウント復旧に使う宛先には、一時メールではなく継続して管理できるアドレスを使います。

次のステップ

この方法を実践する

3時間有効の一時アドレスを生成して認証コードを受け取るか、いつでも停止できる転送エイリアスを作成しましょう。