JMeter 5.1.1:Setup线程组生成的Token无法按线程分配问题求助
解决JMeter线程对应Token分配问题
我之前也踩过完全一样的坑!Setup线程组生成的Token被后面的线程覆盖,导致所有业务线程都复用最后一个Token。下面是我亲身验证过的解决方案,分两步就能搞定:
1. 修改Setup线程组:按线程序号保存Token为全局属性
你已经用正则表达式提取了Token(假设提取的变量名叫token),接下来要在BeanShell断言里给每个线程的Token分配唯一的属性名,彻底避免覆盖问题:
- 打开你的BeanShell断言,替换原有保存属性的代码为:
// 获取当前线程在Setup线程组内的序号(从1开始) int threadIndex = ctx.getThreadNum() + 1; // 拿到正则表达式提取到的Token值 String extractedToken = vars.get("token"); // 保存为带序号的全局属性,比如token_1、token_2...token_25 props.put("token_" + threadIndex, extractedToken);
为什么要加1?因为
ctx.getThreadNum()返回的是线程组内的索引(从0开始计数),加1后就对应1-25的线程序号,能和普通线程组的线程序号完美对应上。
2. 普通线程组:按自身线程序号获取对应Token
在普通线程组的HTTP Sampler中,让每个线程精准获取和自己序号匹配的Token:
- 在需要使用Token的地方(比如请求头的Authorization参数),用JMeter函数组合来读取对应属性:
${__P(token_${__threadNum},)}
拆解一下这个组合:
${__threadNum}:获取当前线程在普通线程组内的序号(1-25)${__P(属性名,默认值)}:读取全局属性,这里就是精准读取token_1到token_25中对应序号的那个
额外验证小技巧
可以在普通线程组里加一个Debug Sampler,勾选JMeter Properties选项,运行后查看每个线程的token_N属性是否正确匹配,确认没问题再跑正式测试。
这样调整后,普通线程组的第1个线程会用Setup线程组第1个线程生成的Token,第2个对应第2个,以此类推,再也不会出现复用最后一个Token的问题啦!
内容的提问来源于stack exchange,提问作者la1
相关产品推荐
相关产品推荐

