FastAPI:不重复的测试邮箱

FastAPI:不重复的测试邮箱

软件测试的稳定性至关重要,尤其是在涉及发送验证电子邮件时。如今这一主题比以往任何时候都更加重要,因为自动化测试是现代开发中不可或缺的一部分。

复用测试邮箱的问题

当我们执行发送电子邮件的测试时,一个常见问题是复用测试邮箱。这可能导致测试一次通过而在下一次运行时失败。出现的一些问题包括:

  • 旧邮件: 上一次测试的邮件可能会干扰新测试,导致测试意外失败。
  • 持续集成(CI)环境中的混乱: 如果多个进程尝试同时访问同一个邮箱,可能会发生冲突。
  • 存在问题的重试: 如果验证链接过期或未被正确使用,重试可能会使用相同的链接,从而影响测试的有效性。

建议的解决方案

为解决这些问题,建议将每封测试邮件视为临时资源。这意味着为每次测试运行创建一个唯一的邮箱。为了实施该策略,每次运行应定义三个值:

  1. run_id: CI 任务或本地运行的标识符。
  2. mailbox_id: 为该次运行创建的邮箱标识符。
  3. expected_token: 将收到的链接与正在测试的用户关联起来的 token。

这种方法可确保某次运行的邮件不会干扰其他运行,从而提高测试的稳定性和可靠性。

在 FastAPI 中的实现

为了在 FastAPI 中实施该策略,我们可以创建一个 endpoint,为每次测试生成一个唯一的邮箱。下面展示了一个实现示例:

from dataclasses import dataclass
from uuid import uuid4
from fastapi import FastAPI

app = FastAPI()

dataclass(frozen=True)
class Mailbox:
    address: str
    mailbox_id: str


def create_test_mailbox(run_id: str) -> Mailbox:
    mailbox_id = f"{run_id}-{uuid4().hex[:8]}"
    return Mailbox(
        address=f"{mailbox_id}@test.invalid",
        mailbox_id=mailbox_id,
    )

@app.post("/test-users")
def create_test_user(run_id: str):
    mailbox = create_test_mailbox(run_id)
    token = uuid4().hex  # Guarda mailbox.mailbox_id y token junto al usuario creado.
    return {
        "email": mailbox.address,
        "mailbox_id": mailbox.mailbox_id,
        "verification_token": token,
    }

在此代码中,每次创建测试用户时,都会生成一个唯一的邮箱。这确保了测试相互独立且更易于诊断。

测试最佳实践

除了创建临时邮箱之外,还应遵循以下一些最佳实践:

  • 隔离测试: 每次运行都应拥有自己的邮箱,避免干扰。
  • 定义 timeout: 这有助于管理在认定邮件未送达之前需要等待多长时间。
  • 测试后清理: 确保在每次测试结束时删除邮箱或将其标记为已关闭,即使测试失败也是如此。

结论

创建隔离的测试邮箱并不能解决所有的身份验证问题,但它在多次运行之间建立了清晰的界限。FastAPI 可以处理 endpoint,而测试适配器则管理邮箱和邮件读取。借助 run_id, tokens, timeouts 以及清理,每次运行都知道自己创建了什么以及应该消费什么。这能减少 CI 中的噪声,并在出现故障时提供更有用的信号。

优点

  • 测试隔离。
  • 易于诊断。
  • 提高测试稳定性。

缺点

  • 初期实现可能需要更多工作量。
  • 需要对临时资源进行良好管理。

注意事项

本文仅供学习参考。在实际实现中,示例值应替换为真实数据。在采信任何说法之前,请务必向原始来源核实。

常见问题

  • 什么是 FastAPI? — FastAPI 是一个用于使用 Python 构建 API 的现代且快速的框架。
  • 为什么测试隔离很重要? — 隔离测试可以避免干扰和不一致的结果,提高可靠性。
  • 如何在 FastAPI 中实现临时邮箱? — 可以创建一个 endpoint,为每次测试运行生成唯一的邮箱。
  • 什么是 run_id? — 这是一个唯一标识符,有助于区分不同的测试运行。
  • 复用测试邮箱会导致什么问题? — 它可能导致偶发性失败、CI 环境混乱以及重试问题。
  • 什么是 mailbox_id? — 它是将特定邮箱与测试运行关联起来的标识符。
Free field guide

API Security Testing Checklist

A practical workflow for testing authentication, authorization, input handling, business logic, and evidence without losing track of scope.