如何在JMeter中为每个用户动态迭代请求并设置差异化迭代次数
JMeter实现不同用户自定义迭代次数及CSV数据分配方案
实现不同用户不同迭代次数的操作步骤
- 首先配置线程组:线程数设置为你需要的总用户数(比如示例中的3个用户就设为3),线程组自带的「循环次数」直接设为1,迭代逻辑由内部控制器实现
- 新增用户定义的变量组件,按规则配置每个用户的迭代次数:比如变量名
iter_1值为5(对应第一个用户迭代5次),iter_2值为3(对应第二个用户迭代3次),iter_3值为1(对应第三个用户迭代1次) - 在线程组下新增循环控制器,循环次数输入框填入表达式:
${__jexl3(${__P(iter_${__threadNum},1)},)},其中__threadNum是JMeter内置函数,可直接获取当前线程(用户)的编号,从1开始计数 - 将需要迭代的请求放到循环控制器子级即可,运行时每个用户会自动按配置的次数执行对应请求
CSV Data Set Config按用户分配数据行的实现方案
可以实现你要求的「第一个用户读前5行、第二个用户读接下来3行」的效果,操作步骤如下:
- 提前整理CSV文件,数据行顺序和你要的分配规则保持一致,前5行是第一个用户的参数、接下来3行是第二个用户的参数,以此类推
- CSV Data Set Config基础配置:
- 「Recycle on EOF」设为
False - 「Stop thread on EOF」设为
True - 「Sharing mode」选择
Current thread
- 「Recycle on EOF」设为
- 在循环控制器下、业务请求前新增JSR223 前置处理器,写入Groovy代码按规则读取对应行的参数,示例代码如下:
// 按顺序配置每个用户对应的迭代次数,下标对应线程号(从0开始计数) def iterCountList = [5,3,1] def currentThread = ctx.getThreadNum() // 计算当前用户的起始读取行号 def startRow = iterCountList.take(currentThread).sum() as int // 获取当前循环的序号,从0开始计数 def currentLoopIdx = vars.get("__jm__循环控制器__idx") as int def targetRow = startRow + currentLoopIdx // 读取CSV文件(路径替换为你本地的CSV路径) def csvLines = new File("你的CSV文件绝对路径").readLines() def rowParams = csvLines.get(targetRow).split(",") // 按列赋值给JMeter变量,可根据你的CSV列数自行扩展 vars.put("param1", rowParams[0]) vars.put("param2", rowParams[1])
提示:如果CSV数据量较大,可在测试计划启动阶段一次性把所有行读入全局属性,避免每次循环都触发IO读取文件,提升压测性能。
内容的提问来源于stack exchange,提问作者Vivek Kanna
相关产品推荐
相关产品推荐

