英語から自動翻訳されています。

英語で読む
Proxy Mail QA

テストと CI

本物のメールを待つサインアップテスト。

エンドツーエンドテストが実際のユーザーと同じようにサインアップし、1回の呼び出しでコードやリンクを取得します。メールそのものをチェックし、並列テストにそれぞれのアカウントを渡し、すべての実行のメールをプルリクエストで確認できます。

Free プラン · npm、Python、REST · Playwright、Cypress、Selenium など

仕組み

テストが止まっていた場所を、1回の呼び出しで。

  1. アドレスを作成する

    1回の呼び出しで、架空のペルソナとパスワード付きのテスト用アドレスを作成するか、フォームのすべての項目の値を取得できます。CI では、1つのアドレスで実行全体をまかなえ、テストごとにプラスタグを使います。

  2. アプリでサインアップする

    テストが Playwright、Cypress、Selenium などでフォームに入力し、送信した時刻を記録します。

  3. コードやリンクを待つ

    メールが届くとすぐに待機が終わり、コードまたはリンクだけが返されます。テストの送信より前のメールは無視されます。

  4. フローを完了する

    コードを入力するかリンクを開き、ユーザーがサインインしたことを確認します。何も届かなかった場合は、わかる範囲でエラーがその理由を示します。

テストで使う

今あるテストに数行追加するだけ。

Node.js 向けの npm パッケージ、インストール不要の Python ヘルパー、それ以外には REST API があります。各ツールの完全な例は開発者向けドキュメントにあります。

npm パッケージを使った Playwright

signup.spec.ts
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

test_signup.py
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 のフックを使うと、各メールがどのテストから来たか、どのテストが失敗したかも示します。

.github/workflows/e2e.yml
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 には専用のプロジェクトまたはキーを用意し、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 に接続したエージェントは同じプロジェクトのプールからアカウントを借りて返却するので、エージェントとテストスイートが同時に同じアカウントを使うことはありません。

その他の機能

次のサインアップテストで、本物のメールを待ちましょう。

無料アカウントを作成し、プロジェクト設定で API キー を作成して、既存のテストに待機を1つ追加します。

無料アカウントを作成アプリを開く

このページについて質問がありますか?

質問はどの言語でもかまいません。ドキュメントからすぐに回答を得ることも、Proxy Mail QA チームに質問を送ることもできます。チームからの返信は英語です。