如何用JMeter构建OTP逻辑,实现移动端5万用户登录压测?
实现虚拟邮箱OTP登录的JMeter脚本逻辑
1. 生成唯一虚拟邮箱ID
为每个测试用户生成独立的唯一邮箱,确保线程级隔离:
- 使用JMeter内置函数生成,示例:
- 随机字符串+固定域名:
${__RandomString(8,abcdefghijklmnopqrstuvwxyz,)}@test-domain.com - 递增用户ID+固定域名:
user${__counter(TRUE,)}@test-domain.com
- 随机字符串+固定域名:
- 将生成的邮箱存储为线程变量(如
${virtual_email}),后续所有相关请求直接引用该变量。
2. 触发OTP发送请求
调用录制完成的「提交邮箱获取OTP」API:
- 将请求中的邮箱参数替换为
${virtual_email},保证每个线程发送自身对应的虚拟邮箱。 - 添加响应断言,验证请求返回状态(如200 OK),确认OTP发送指令已成功触发。
3. 从虚拟邮箱获取OTP
根据你的虚拟邮箱服务类型,选择以下适配方案:
方案A:通过IMAP/POP3协议读取邮件
使用JMeter自带的Mail Reader Sampler:
- 在OTP发送请求后添加Mail Reader Sampler。
- 配置核心参数:
- 邮件服务器地址:你的虚拟邮箱IMAP服务器地址(如
imap.test-domain.com) - 端口:993(SSL加密场景,非SSL用143)
- 用户名:
${virtual_email} - 密码:虚拟邮箱的登录密码(无密码验证可留空,依服务配置而定)
- 搜索条件:设置为「主题包含OTP」或「发件人为系统官方邮箱」,缩小目标邮件范围
- 邮件服务器地址:你的虚拟邮箱IMAP服务器地址(如
- 添加正则表达式提取器,从邮件内容中提取OTP:
- 引用名称:
OTP - 正则表达式:
(\d{6})(假设OTP为6位数字,需根据实际格式调整) - 模板:
$1$
- 引用名称:
方案B:通过虚拟邮箱API获取邮件
若你的虚拟邮箱提供REST查询API:
- 添加HTTP Request Sampler,调用邮箱查询接口(示例:
GET /api/v1/emails/${virtual_email}) - 添加JSON Extractor(响应为JSON格式时),从返回结果中提取OTP字段:
- 引用名称:
OTP - JSON Path表达式:
$.latest_email.content.otp(需根据实际API返回结构调整)
- 引用名称:
处理邮件延迟问题
邮件发送存在延迟,需添加等待逻辑确保OTP能被成功提取:
- 使用While Controller,条件设置为
${__jexl3(${OTP} == "",)} - 控制器内放置「邮件读取请求」和Constant Timer(设置1000毫秒),循环执行直到提取到有效OTP为止。
4. 使用OTP完成登录
调用录制好的「提交OTP登录」API:
- 将请求中的OTP参数替换为
${OTP} - 添加响应断言,验证登录结果(如返回用户token或个人信息),确认登录流程完成。
高并发适配注意事项(针对50000用户)
- 若使用IMAP方案:需确保邮件服务器允许足够的并发连接数,或通过JMeter的HTTP请求默认配置开启连接池复用
- 优先选择API方案:相比IMAP协议,API的并发性能更优,更适合大规模负载测试场景
- 分布式测试部署:单台JMeter实例无法支撑5万并发,需采用JMeter分布式部署,多台机器协同压测
- 虚拟邮箱服务扩容:确保虚拟邮箱系统能同时处理5万条邮件的接收与查询请求
内容的提问来源于stack exchange,提问作者vishakha bharambe
相关产品推荐
相关产品推荐

