MoeMail
返回博客

如何自动化 OTP 与 2FA 登录测试

双因素登录正是那种团队在自动化测试里常常跳过的流程,因为它做起来别扭——可偏偏它出回归问题时最伤。这里有两种情形,两种都能自动化。相近的流程可参见测试找回密码邮件魔法链接登录。本文是开发者邮件测试指南的一部分。

情形一:邮件或短信 OTP

如果验证码是通过邮件来的,那做法和任何邮件测试都一样:开一个一次性收件箱,触发登录,通过 API 读取邮件,再把数字提取出来。每个用例开一个收件箱,轮询(或用 Webhook)直到 OTP 落地。

const inbox = await createInbox()
// ...submit the login form with inbox.address...
const msg = await waitForMessage(inbox.id, 30000)
const otp = msg.text.match(/[0-9]{6}/)[0]
// ...type otp into the verification field...

浏览器驱动的完整版本参见 Playwright 邮件测试教程,收件箱小助手参见一次性邮箱 API 指南

情形二:身份验证器 App(TOTP)

如果 2FA 用的是身份验证器 App,你根本不需要手机——验证码是用 TOTP 算法从一个共享密钥推导出来的。把那个密钥存为测试环境变量,再在测试里用诸如 otplib 之类的库生成验证码:

import { authenticator } from 'otplib'

const token = authenticator.generate(process.env.TOTP_SECRET)
// ...type token into the 2FA field...

这个密钥,和应用在初始化二维码里编码的是同一个;在绑定环节把它显示出来,并且只为测试环境保存下来。

测试环境策略

当两条路都不方便时,和你的团队商量一下专供测试的旁路:一个在预发环境里永远有效的特殊令牌、为指定测试用户禁用 2FA,或者对来自 CI IP 的请求跳过它。挑那个仍能走通真实登录路径的、最小的旁路。

动手开始

对于邮件验证码,创建一个邮箱并通过 OpenAPI 读取它;对于 TOTP,则把共享密钥接好。无论哪种,都做到每个用例一个收件箱或一个密钥,你的 2FA 测试套件就能保持稳定。