本页由英文自动翻译。

阅读英文版
Proxy Mail QA

测试和 CI

等待真实邮件的注册测试。

你的端到端测试像真实用户一样注册,然后一次调用拿到验证码或链接。检查邮件本身,为并行测试各分配账号,并在 pull request 上看到每次运行的邮件。

Free 套餐 · npm、Python 和 REST · Playwright、Cypress、Selenium 等

工作原理

过去测试卡住的地方,现在只需一次调用。

  1. 创建地址

    一次调用即可创建带有虚构身份和密码的测试地址,或给出表单每个字段的值。在 CI 中,一个地址可以服务整次运行,每个测试用一个加号标签。

  2. 在你的应用中注册

    你的测试用 Playwright、Cypress、Selenium 或其他工具填写表单,并记录提交时间。

  3. 等待验证码或链接

    邮件一到,等待就返回,只带验证码或链接。测试提交之前的邮件会被忽略。

  4. 完成流程

    输入验证码或打开链接,检查用户已登录。如果什么都没收到,错误信息会尽可能说明原因。

在你的测试中

在已有的测试里加几行即可。

适用于 Node.js 的 npm 包、无需安装的 Python 辅助工具,其他情况用 REST API。各工具的完整示例见开发者文档。

Playwright 配合 npm 包

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();
});

pytest 配合 Python 辅助工具

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"))

测试可以检查什么

不只是“验证码到了没有”。

验证码和链接

验证码和登录码,以及验证、魔法登录、邀请和重置链接,只看测试提交之后发出的邮件。

没收到,或只收到一封

证明已退订的用户没有收到新闻邮件,并发现注册时发了两封验证邮件而不是一封的情况。

邮件的发送和构建

SPF、DKIM 和 DMARC,指向 localhost 或纯 http 的链接,本该指向 staging 却指向生产环境的链接,缺少过期时间,是否适合手机显示,以及你预期的文本和语言。

账号池

给账号打上状态标签,让每个测试借用一个。没有空闲账号时,你自己的 hook 会创建一个,确认其状态后再归还。并行测试永远不会共用账号。

pull request 上的报告

哪些邮件到了、速度多快、各来自哪个测试、验证码和链接、哪些失败了,以及与上几次运行相比有什么变化:邮件变慢、多出邮件、不稳定的测试。

邮件为什么没到

等待返回为空时,错误信息会尽可能说明原因,比如邮件服务商处于沙盒模式,只向已验证的地址发信。

在 pull request 上

每次运行的邮件,就在你审查代码的地方。

在测试之前加上 Proxy Mail QA action。npm 包和 Python 辅助工具会把它们看到的内容加入运行,任务结束时无论是否通过,action 都会发布报告。配合 Playwright fixture 和 reporter,或 pytest hook,报告还会说明每封邮件来自哪个测试、哪些测试失败了。

.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 而做

每次 push 都可以放心运行。

  • 独立的密钥

    给 CI 单独的项目或密钥,保存在你的 CI 系统的 secrets 中。吊销它不会影响其他任何东西。

  • 每次运行一个地址

    发到 name+任意内容@ 的邮件会到达 name@,而在带标签的地址上等待只会找到它自己的邮件,所以繁忙的流水线也能远低于每日上限。

  • 并行 worker

    无论等待多久,一次等待只算一次请求。密钥在 Free 套餐每分钟可发 60 次请求,在 Team 套餐为 600 次。

  • 报告不保存邮件正文

    运行会保存地址、验证码、耗时、检查结果、失败测试的名称和错误,以及每个链接的网站和路径,类似令牌的部分会被隐藏。绝不保存邮件的正文或主题,也不保存链接的查询参数。运行保留 90 天。

  • fork 拿不到 secrets

    对于来自 fork 的 pull request,action 会发出警告且不启动运行,所以你的密钥永远不会到达你未审查过的代码。

  • 仅限测试站点

    Proxy Mail QA 用于你开发或有权测试的应用的开发、预发布、QA、预览和本地版本,绝不用于线上版本。

FAQ

常见问题

测试能检查优惠券和退订吗?

能。等待带折扣和截止日期的优惠券,记录结账时如何处理它,检查同一个人不能重复领取优惠,并把地址标记为已退订,之后的营销邮件就会判为失败。见营销和优惠邮件。

它支持哪些测试工具?

任何能发 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 个地址(每天最多 50 个),加号标签让一个地址可以服务整次运行。Team 不限地址数,请求上限提高到每分钟 600 次。

报告能在 GitHub Actions 之外使用吗?

能。用 API 开始一次运行(npm 包中用 qa.startRun(),Python 中用 start_run()),每次调用都带上它的 id,结束运行,然后以 Markdown 格式获取报告,发到你审查代码的任何地方。

什么会让运行失败?

测试等待的邮件始终没到、不该来的邮件来了、邮件检查失败、reporter 记录的测试失败、退订后仍收到营销邮件、同一个人收到两次优惠、本不该接受的优惠券被接受,或有备注这样说明。把 fail-job 设为 true 时,即使测试通过,action 也会让任务失败。

我的编程智能体能用同一个账号池吗?

能。连接到 MCP server 的智能体从同一项目的账号池借出和归还账号,所以智能体和你的测试套件永远不会同时使用同一个账号。

更多功能

让你的下一个注册测试等待真实邮件。

创建免费账号,在 Project settings 中创建一个 API 密钥,然后在已有的测试中加一次等待。

免费创建账号打开应用

对本页有疑问?

可以用任何语言提问。文档可以立即回答,你也可以把问题发给 Proxy Mail QA 团队,他们会用英文回复。