You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JMeter中生成跨多用户的随机唯一手机号码?

针对负载测试动态生成唯一手机号的解决方案

你当前使用的纯随机生成逻辑存在两个问题:一是随机数本身不保证唯一性,1000并发场景下有概率出现重复;二是(int)Math.floor(Math.random() * (9000000000 - 9000020000)) + 9000020000存在类型溢出错误,9000000000已经超过int类型最大取值2147483647,强制转int会导致生成的号码不符合预期。

不需要预生成参数化数据的前提下,可选择以下两种方案实现运行时动态生成全局唯一手机号:

方案1:线程ID拼接前缀(零重复风险,性能最优)

直接利用负载测试工具的线程唯一标识生成号码,1000并发场景下线程ID天然不重复,完全规避碰撞概率:

  • 示例Groovy代码(适配JMeter等主流负载测试工具):
// 自定义符合测试要求的手机号前7位前缀
def prefix = "1380013"
// 补零对齐为4位线程ID,适配1000并发场景
def threadId = ctx.getThreadId().toString().padLeft(4, '0')
// 末位补1位随机数,兼容单线程多次发起请求的场景
def suffix = new Random().nextInt(10).toString()
// 生成11位唯一手机号并存为变量供后续请求调用
def uniquePhone = prefix + threadId + suffix
vars.put("unique_phone", uniquePhone)
  • 优势:生成逻辑无锁、性能极高,完全不存在重复可能,适合高并发压测场景。

方案2:全局原子计数器(兼顾号段随机性)

如果要求手机号前缀也具备随机性,可以用线程安全的原子计数器实现全局唯一序号,拼接随机号段前缀:

  • 示例Groovy代码:
// 全局计数器仅在测试启动时初始化一次
if (props.get("phone_seq_counter") == null) {
    props.put("phone_seq_counter", new java.util.concurrent.atomic.AtomicInteger(1000))
}
// 原子自增获取唯一序号,并发场景下不会出现重复取数
def seq = props.get("phone_seq_counter").getAndIncrement()
// 随机抽取符合规则的手机号前3位号段
def prefixList = ["130","131","132","133","134","135","136","137","138","139","150","151","152","153","155","156","157","158","159","180","181","182","183","184","185","186","187","188","189"]
def randomPrefix = prefixList.get(new Random().nextInt(prefixList.size()))
// 拼接生成11位唯一手机号
def uniquePhone = randomPrefix + seq.toString()
vars.put("unique_phone", uniquePhone)
  • 优势:兼顾号码随机性和全局唯一性,不需要提前准备任何静态参数数据。

内容的提问来源于stack exchange,提问作者Raghav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 00:39:04