セットアップ
Python のドキュメント からヘルパー proxymail_qa.py をテストフォルダにコピーし、API キー を PROXYMAIL_QA_API_KEY に設定します。シェル、Git から除外した .env ファイル、または CI のシークレットに設定できます。Free プランで十分です。
テスト
Python 向けの Playwright の場合:
import re
from playwright.sync_api import Page, expect
from proxymail_qa import create_address, delete_address, now, wait_for_link
def test_sign_up_verifies_the_email(page: 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")) delete_address(account["address"])コードの場合は wait_for_code(address, since=submitted) を使い、返された値を入力します。Selenium でも呼び出しは同じです。driver.find_element でフィールドを見つけ、コードを送信するかリンクを開きます。since により、フォーム送信前に送られたメールは待機の対象外になるため、テストを再試行しても古いメールを読むことはありません。
リンクだけでなくメールも確認する
import time
from proxymail_qa import check_email, count_emails, now, wait_for_link
def test_sign_up_sends_one_good_verification_email(page, account): submitted = now() page.get_by_role("button", name="Sign up").click() wait_for_link(account["address"], since=submitted) time.sleep(10) # give a duplicate time to arrive assert count_emails(account["address"], since=submitted, type="link")["count"] == 1 assert check_email(account["address"], since=submitted, expect_host="staging.example.com")["failed"] == []check_email は、SPF、DKIM、DMARC、localhost や暗号化されていない http へのリンク、リンク先などについて判定結果を返します。メール自体は返しません。expect_no_email は、拒否されるべき 2 回目のリセットリクエストなど、ある操作で何も送信されないことを確認します。
CI で実行し、プルリクエストにレポートを表示する
conftest.py でヘルパーの pytest フックをインポートします。GitHub Actions では、テストの前に Proxy Mail QA アクション を追加します。プルリクエストのレポートには、各メールの送信元のテストと、失敗したテストとそのメールの状況が表示されます。
from proxymail_qa import pytest_runtest_setup, pytest_runtest_teardown, pytest_runtest_logreport, pytest_sessionfinish - uses: aaquib90/proxymail-qa-action@v1 with: api-key: ${{ secrets.PROXYMAIL_QA_API_KEY }} - run: pytest env: PROXYMAIL_QA_API_KEY: ${{ secrets.PROXYMAIL_QA_API_KEY }}フックは実行中以外は何もせず、フック自体がテストを失敗させることはありません。詳しくは Python のドキュメント と CI での実行 をご覧ください。