JMeter技术问询:线程间用户变量传递与多用户批量登出方案
解答你的两个JMeter问题
问题1:如何把线程组每个用户的变量传递到第二个线程组?
JMeter里普通变量是线程局部的——每个线程自己的变量,其他线程(包括其他线程组的)都拿不到。要跨线程组传递,得用全局属性来存,而且必须给每个用户的变量加唯一标识(比如线程号),不然后面用户的变量会直接覆盖前面的。
具体操作步骤:
- 第一步:在第一个线程组里,用户生成目标变量后,用
__setProperty函数把变量存成带线程号的全局属性。比如你要传递session_id,就在登录请求的后置处理器(比如正则提取器拿到session_id后),直接用这个函数:
这里${__setProperty(session_${__threadNum},${session_id},)}${__threadNum}是当前线程的编号,这样每个线程的session id会存在session_1、session_2...这类全局属性里,不会互相覆盖。 - 第二步:把两个线程组设置成顺序执行。在测试计划的右上角,勾选
Run thread groups consecutively (i.e. one at a time),确保第一个线程组所有用户都跑完,再启动第二个线程组。 - 第三步:在第二个线程组里,用
__P函数取对应线程号的属性。比如要拿到当前线程对应的session id,就写:
这样第二个线程组的第N个用户,就能精准拿到第一个线程组第N个用户的session id了。${__P(session_${__threadNum},)}
问题2:时长限制终止测试后,如何让所有用户执行干净登出?
你之前遇到的“只拿到最后一个session id”的问题,核心就是没给每个session加唯一标识,导致后面线程的变量覆盖了前面的。结合问题1的思路,咱们可以用两种方案解决:
方案一:全局属性+线程号匹配(无需文件,推荐)
配置第一个业务线程组:
- 登录后提取到
session_id,添加一个「JSR223 PostProcessor」(选Groovy语言,性能更好),写入代码把每个线程的session id存到全局属性:// 把当前线程的session_id存成带线程号的全局属性 props.put("session_" + ctx.getThreadNum(), vars.get("session_id")); // 顺便把总线程数存起来,方便后面登出用 props.put("total_users", ctx.getThreadGroup().getNumThreads().toString()); - 测试计划里务必勾选
Run thread groups consecutively,保证业务线程组跑完再启动登出组。
- 登录后提取到
配置第二个登出线程组:
- 线程数设置为100(和业务组一致),循环次数设为1。
- 在Logout请求的参数里,把session id的值设为
${__P(session_${__threadNum},)},这样每个线程会取对应编号的session id,不会出现重复登出同一个用户的情况。
确保测试终止后登出线程组能执行:
默认情况下,如果测试因为时长到了被强制停止,JMeter会终止所有线程。你可以给业务线程组加一个「Test Action Sampler」,设置Timeout (in milliseconds)为600000(也就是600秒),这样线程会在超时后正常结束,而非被强制杀死,登出线程组就能顺利执行。
方案二:用CSV文件存储session id(更直观,适合非技术人员)
如果觉得代码麻烦,咱们可以用文件来存储每个用户的session id:
业务线程组里存session到CSV:
- 登录后提取
session_id,添加「JSR223 PostProcessor」,写入代码把session id追加到CSV文件:
注意:把// 打开文件,以追加模式写入 def writer = new FileWriter("session_ids.csv", true); writer.write(vars.get("session_id") + "\n"); writer.close();session_ids.csv放在JMeter的bin目录下,或者写绝对路径(比如C:\apache-jmeter-5.6.3\bin\session_ids.csv)。
- 登录后提取
登出线程组读取CSV:
- 添加「CSV Data Set Config」,设置:
- Filename: session_ids.csv
- Variable Names: session_id
- Recycle on EOF: False
- Stop thread on EOF: True
- 线程数设为100,循环次数1,这样每个线程读取CSV里的一行,用对应的session id执行登出。
- 添加「CSV Data Set Config」,设置:
内容的提问来源于stack exchange,提问作者Yevhen Tokarenko
相关产品推荐
相关产品推荐

