テストと CI
本物のメールを待つサインアップテスト。
エンドツーエンドテストが実際のユーザーと同じようにサインアップし、1回の呼び出しでコードやリンクを取得します。メールそのものをチェックし、並列テストにそれぞれのアカウントを渡し、すべての実行のメールをプルリクエストで確認できます。
Free プラン · npm、Python、REST · Playwright、Cypress、Selenium など
仕組み
テストが止まっていた場所を、1回の呼び出しで。
アドレスを作成する
1回の呼び出しで、架空のペルソナとパスワード付きのテスト用アドレスを作成するか、フォームのすべての項目の値を取得できます。CI では、1つのアドレスで実行全体をまかなえ、テストごとにプラスタグを使います。
アプリでサインアップする
テストが Playwright、Cypress、Selenium などでフォームに入力し、送信した時刻を記録します。
コードやリンクを待つ
メールが届くとすぐに待機が終わり、コードまたはリンクだけが返されます。テストの送信より前のメールは無視されます。
フローを完了する
コードを入力するかリンクを開き、ユーザーがサインインしたことを確認します。何も届かなかった場合は、わかる範囲でエラーがその理由を示します。
テストで使う
今あるテストに数行追加するだけ。
Node.js 向けの npm パッケージ、インストール不要の Python ヘルパー、それ以外には REST API があります。各ツールの完全な例は開発者向けドキュメントにあります。
npm パッケージを使った Playwright
import { test, expect } from '@playwright/test';
import { ProxyMailQA } from 'proxymail-qa';
const qa = new ProxyMailQA(); // reads PROXYMAIL_QA_API_KEY
test('sign-up sends a working code', async ({ page }) => {
const { address, password } = await qa.createAddress({ password: true });
await page.goto('/sign-up');
await page.getByLabel('Email').fill(address);
await page.getByLabel('Password').fill(password);
const submitted = new Date();
await page.getByRole('button', { name: 'Sign up' }).click();
const { value: code } = await qa.waitForCode(address, { since: submitted });
await page.getByLabel('Code').fill(code);
await expect(page.getByText('Welcome')).toBeVisible();
});Python ヘルパーを使った pytest
import re
from playwright.sync_api import expect
from proxymail_qa import create_address, now, wait_for_link
def test_sign_up_verifies_the_email(page):
account = create_address()
page.goto("/signup")
page.get_by_label("Email").fill(account["address"])
page.get_by_label("Password").fill(account["password"])
submitted = now()
page.get_by_role("button", name="Sign up").click()
page.goto(wait_for_link(account["address"], since=submitted))
expect(page).to_have_url(re.compile("verified"))テストでチェックできること
「コードが届いたか」だけではありません。
コードとリンク
認証コードやログインコード、認証、マジックサインイン、招待、リセットの各リンク。テストの送信後に届いたメールだけが対象です。
何も届かなかったこと、1通だけ届いたこと
配信停止したユーザーにニュースレターが届かなかったことを証明し、サインアップで認証メールが1通ではなく2通送られるのを検出します。
メールの送信と構成
SPF、DKIM、DMARC、localhost や平文の http へのリンク、ステージングではなく本番に向かうリンク、有効期限の欠落、スマートフォンに収まるか、そして期待するテキストと言語。
アカウントプール
アカウントに状態をタグ付けし、各テストに1つずつ貸し出します。空きがなければ独自のフックで作成し、状態を確認して返却します。並列テストが同じアカウントを共有することはありません。
プルリクエストへのレポート
どのメールがどれだけ速く届いたか、それぞれどのテストから来たか、コードとリンク、失敗した内容、そして直近の実行からの変化(遅くなったメール、余分なメール、不安定なテスト)。
メールが届かない理由
待機が空で返ってきたとき、わかる範囲でエラーが理由を示します。たとえば、認証済みアドレスにしか送信しないサンドボックスモードのメールプロバイダーなどです。
プルリクエスト上で
すべての実行のメールを、コードをレビューする場所で。
テストの前に Proxy Mail QA アクションを追加します。npm パッケージと Python ヘルパーが検出した内容を実行に追加し、ジョブが終わると成否にかかわらずアクションがレポートを投稿します。Playwright のフィクスチャとレポーター、または pytest のフックを使うと、各メールがどのテストから来たか、どのテストが失敗したかも示します。
jobs:
e2e:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/checkout@v7
- uses: aaquib90/proxymail-qa-action@v1
with:
api-key: ${{ secrets.PROXYMAIL_QA_API_KEY }}
- run: npm ci
- run: npx playwright test
env:
PROXYMAIL_QA_API_KEY: ${{ secrets.PROXYMAIL_QA_API_KEY }}CI のために
プッシュのたびに実行しても安全です。
-
専用のキー
CI には専用のプロジェクトまたはキーを用意し、CI システムのシークレットに保存します。取り消しても他には影響しません。
-
実行ごとに1つのアドレス
name+anything@ 宛てのメールは name@ に届き、タグ付きアドレスでの待機はそのアドレス宛てのメールだけを見つけます。そのため、忙しいパイプラインでも1日の上限に十分収まります。
-
並列ワーカー
待機は、どれだけ長く続いても1リクエストです。キーのリクエスト数は Free で毎分60回、Team で毎分600回です。
-
レポートにはメールの本文を残しません
実行に保存されるのは、アドレス、コード、所要時間、チェック結果、失敗したテストの名前とエラー、各リンクのサイトとパスです。トークンのような部分は隠されます。メールの本文や件名、リンクのクエリは保存しません。実行は90日間保存されます。
-
フォークにはシークレットを渡しません
フォークからのプルリクエストでは、アクションは警告を出して実行を開始しません。そのため、レビューしていないコードにキーが渡ることはありません。
-
テストサイト専用
Proxy Mail QA は、あなたが開発している、またはテストを許可されているアプリの開発・ステージング・QA・プレビュー・ローカル版専用です。本番環境には使用しません。
FAQ
よくある質問
テストでクーポンや配信停止をチェックできますか?
はい。割引と終了日付きのクーポンを待ち、チェックアウトでの扱いを記録し、1人が同じオファーを2回受け取れないことを確認し、アドレスを配信停止としてマークして、以降のマーケティングメールを失敗にできます。マーケティングとオファーのメールを参照してください。
どのテストツールで使えますか?
HTTP リクエストを送れるものなら何でも使えます。npm パッケージは Playwright、Cypress、Puppeteer などの Node.js テストランナーに対応し、Python ヘルパーは Selenium または Playwright を使う pytest に対応します。XCUITest、Espresso、Flutter、Maestro、Detox、Appium 向けの小さなヘルパーも、メールのチェック、アカウントプールの利用、実行レポートへの追加ができます。それ以外は REST API を使います。
Team プランは必要ですか?
いいえ。npm パッケージ、Python ヘルパー、REST API、GitHub Action、実行、アカウントプールはすべてのプランで使えます。Free のキーは毎分60リクエスト、Free アカウントのアドレスは合計500件(1日最大50件)で、プラスタグを使えば1つのアドレスで実行全体をまかなえます。Team ではアドレスの上限がなく、リクエスト上限が毎分600回になります。
レポートは GitHub Actions 以外でも使えますか?
はい。API で実行を開始し(npm パッケージでは qa.startRun()、Python では start_run())、各呼び出しでその id を送り、実行を終了して、レポートを Markdown として取得すれば、コードをレビューする場所に投稿できます。
何があると実行が失敗になりますか?
テストが待っていたのに届かなかったメール、届くべきでないのに届いたメール、失敗したメールチェック、レポーターが記録した失敗テスト、配信停止後のマーケティングメール、1人に同じオファーが2回届いたこと、受け付けるべきでないクーポンが受け付けられたこと、またはそう記したメモです。fail-job を true にすると、テストが合格していてもアクションがジョブを失敗にできます。
コーディングエージェントも同じアカウントプールを使えますか?
はい。MCP server に接続したエージェントは同じプロジェクトのプールからアカウントを借りて返却するので、エージェントとテストスイートが同時に同じアカウントを使うことはありません。