如何在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
相关产品推荐
相关产品推荐

