jmeter-如何在多线程一起执行时,控制请求的执行顺序【临界部分控制器】

当多线程执行包含特定顺序的脚本时,如获取验证码、注册和登录流程,可能会出现请求顺序混乱导致失败。为了解决这个问题,文章介绍了如何使用JMeter的临界部分控制器来保证请求按预期顺序执行。通过设置锁名称为空、相同或为变量(加上随机数)来控制并发时的串行执行,从而实现并发场景下的顺序控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

一个线程多个脚本的时候,发现只要100个用户同时执行,请求就会乱。

期望2个线程执行结果:

  1. 获取验证码-注册-登录这个流程

  1. 获取验证码-注册-登录这个流程

实际2个线程执行结果:

a. 登录-获取验证码-注册

b. 注册-获取验证码-登录

三个接口顺序有的先有的后,导致有的接口执行失败,为了能够让几个请求在多个线程下也是按照我们想要的顺序执行,就用到一个控制器【临界部分控制器】

1、在线程组中添加控制器-临界部分控制器

2、关于琐名称

锁名为空:认为每个锁为不同的锁

锁名相同,多个锁认为是同一个锁,同一个时间点只能存在一个在运行中的请求,就是琐之间只能串行

锁名为变量,根据变量值来判断是不是属于同一个锁,变量值为相同时,则认为是同一个锁

我们为了并发,为琐增加一个随机数,步骤:在函数助手中,设置随机数,复制并填写到琐的名称

3、看一下两种方式对比,一个直接在线程组下创建接口,一个是在临界部分创建接口,接口的顺序我们是一样的

4、执行结果就是按照接口从上往下,依次执行,符合预期的场景

<think>好的,用户问的是JMeter线程组传参的问题。我之前回答过props.put,现在要转换到JMeter,可能需要先回忆相关知识。 首先,JMeter线程组默认是独立的,变量作用域在各自线程组内。用户可能遇到需要多个线程组共享参数的情况,比如登录信息传递给后续操作。这候需要跨线程传递参数,常见的几种方法是什么? 记得有使用属性(Properties),因为JMeter中属性是全局的,可以用__setProperty和__P函数来设置和获取。另外,还有通过BeanShell或JSR223脚本的方式,或者使用文件存储中间数据,比如CSV或临文件。还可能用到JMeter的Test Action组件或定器来控制执行顺序。 接下来要详细解释每种方法。比如属性方法,用户需要知道如何在线程组A中设置属性,线程组B中读取。要注意属性是全局的,所以命名要唯一,避免冲突。同,线程执行顺序可能影响参数的传递,可能需要同步控制器或者安排线程组顺序。 然后考虑使用BeanShell或JSR223,这里可能需要写脚本,用户可能需要示例代码。比如用vars.put和props.put来传递变量到属性中,或者用${__BeanShell()}函数。不过脚本执行可能有性能影响,特别是高并发。 文件方式的话,比如在线程组A将变量写入CSV,线程组B读取。需要确保文件操作的正确性和同步,避免读写冲突。可能用到监听器保存变量到文件,或者用BeanShell写文件。 另外,跨线程组传参线程组执行顺序很重要。如果线程组B在线程组A之前执行,可能获取不到数据,需要调度控制器或设置线程组的启动延迟。用户可能没有意识到这点,需要提醒。 还要注意参数的生命周期,属性是全局的,在整个测试计划中有效,而变量是线程局部的。可能有些用户混淆这两者的作用域,需要区分清楚。 实际应用场景比如用户登录后的token传递到其他线程组请求中,或者多个线程组共享动态参数。需要给出具体例子,帮助用户理解如何应用这些方法。 最后总结最佳实践,比如优先使用属性,避免脚本性能问题,确保执行顺序,处理同步问题等。同提醒用户注意线程安全和数据唯一性,避免并发问题。</think>JMeter线程组参数传递是一个需要特殊处理的场景,因为默认情况下变量作用域仅限于当前线程组。以下是 5 种常用方法及详细技术实现: 一、全局属性法(推荐方案) 1. 发送端设置全局属性 ```beanshell // 在线程组A中使用 BeanShell 后置处理器 props.put("GLOBAL_TOKEN", vars.get("local_token")); // 或使用函数助手:${__setProperty(GLOBAL_TOKEN,${local_token},)} ``` 2. 接收端获取属性值 ```beanshell // 在线程组B中使用前置处理器 vars.put("received_token", props.get("GLOBAL_TOKEN")); // 或直接引用:${__P(GLOBAL_TOKEN,)} ``` 二、文件中介法(适合大数据量) 1. 线程组A写入CSV ```beanshell // 使用 BeanShell 后置处理器写入文件 FileWriter fw = new FileWriter("temp.csv", true); fw.write(vars.get("dynamic_id") + "\n"); fw.close(); ``` 2. 线程组B配置CSV Data Set Config ``` Filename: temp.csv Variable Names: shared_id Recycle on EOF: False Stop thread on EOF: True Sharing mode: All threads ``` 三、JSR223 共享对象法(高性能方案) 1. 测试计划级别初始化 ```groovy // 在测试计划中添加 JSR223 初始化脚本 props.put("SHARED_MAP", new java.util.concurrent.ConcurrentHashMap()); ``` 2. 线程组A存值 ```groovy def sharedMap = props.get("SHARED_MAP"); sharedMap.put(System.currentTimeMillis().toString(), vars.get("session_id")); ``` 3. 线程组B取值 ```groovy def sharedMap = props.get("SHARED_MAP"); if(!sharedMap.isEmpty()) { vars.put("target_value", sharedMap.values().iterator().next()); sharedMap.clear(); } ``` 四、Redis 中间件法(分布式测试) 1. 线程组A存储到Redis ```java // 使用 JSR223 + Jedis 客户端 import redis.clients.jedis.Jedis; Jedis jedis = new Jedis("127.0.0.1", 6379); jedis.set("JMETER:COOKIE", vars.get("auth_cookie")); ``` 2. 线程组B获取Redis值 ```java Jedis jedis = new Jedis("127.0.0.1", 6379); vars.put("redis_cookie", jedis.get("JMETER:COOKIE")); ``` 五、同步控制器法(严格顺序场景) 1. 线程组设置 - 线程组A:设置 Synchronizing Timer (Number of Simultaneous Users = 1) - 线程组B:设置 Startup Delay (足够让线程组A完成) 2. 参数传递流程 ``` 线程组A执行 → 结果写入文件 → 线程组B启动 → 读取文件参数 ``` 关键注意事项: 1. 并发安全 - 使用 ConcurrentHashMap 代替普通 HashMap - 对共享资源添加 synchronized 锁 ```java synchronized(props.get("LOCK")) { // 临界区操作 } ``` 2. 性能优化 - 避免在循环中频繁读写共享资源 - 使用 try-with-resources 管理文件流 ```java try(FileWriter fw = new FileWriter("data.txt", true)) { fw.write(vars.get("value")); } ``` 3. 参数清理 - 在测试结束的 Teardown 线程组中添加清理脚本 ```groovy new File("temp.csv").delete(); props.get("SHARED_MAP").clear(); ``` 典型应用场景: 1. 登录鉴权:将登录线程组生成的 token 传递给业务线程组 2. 数据关联:线程组A生成订单号,线程组B进行支付操作 3. 分布式测试:多台 JMeter 机器通过 Redis 共享测试参数 调试技巧: 1. 添加 Debug Sampler 查看变量传递状态 2. 使用 View Results Tree 过滤特定线程组 3. 在日志中打印共享参数值: ```beanshell log.info("Received value: " + props.get("SHARED_PARAM")); ``` 选择建议: - 单机测试 → 全局属性法 - 分布式测试 → Redis中间件法 - 大数据量 → 文件中介法 - 严格顺序 → 同步控制器- 高频访问 → JSR223共享对象法 通过合理选择参数传递方式,可以有效实现 JMeter 多线程组的协作测试,模拟真实业务场景中的复杂数据流转。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值