如何在JMeter中指定多用户名行循环执行Login API测试?
实现思路与步骤
1. 调整目标用户变量格式
把User Defined Variables里的用户名改成逗号分隔的字符串,比如:
target_users=Test1,Test3
后续要增删测试用户,直接修改这个字符串就行,不用改动逻辑代码。
2. 初始化用户数组与循环索引
在Thread Group下添加JSR223 Sampler,执行以下代码拆分用户列表并初始化循环参数:
// 拆分目标用户为数组 def targetUsers = vars.get("target_users").split(",") vars.putObject("users_array", targetUsers) // 记录数组长度,用于循环判断 vars.put("users_array_size", String.valueOf(targetUsers.length)) // 初始化当前用户索引 vars.put("current_user_index", "0")
3. 用While Controller控制多用户循环
添加While Controller,设置循环条件为:
${__jexl3(${current_user_index} < ${users_array_size},)}
这个条件会在遍历完所有目标用户后自动停止循环。
4. 取出当前待处理的用户名
在While Controller内部、CSV配置之前,添加JSR223 PreProcessor,取出当前索引对应的用户名:
def users = vars.getObject("users_array") def currentIndex = Integer.parseInt(vars.get("current_user_index")) def currentUser = users[currentIndex] vars.put("current_username", currentUser)
5. 配置CSV数据过滤
修改CSV Data Set Config的参数:
- Filename:保持你的CSV文件路径不变
- Variable Names:
Username,AccessKey,Token - Filter Records:勾选后输入过滤条件:
${__jexl3(Username == '${current_username}',)} - Recycle on EOF:设为
False - Stop thread on EOF:设为
False
这样CSV只会加载当前用户名对应的行数据,确保后续API调用使用该用户的AccessKey和Token。
6. 放置用户专属API流程
把Login API以及该用户需要执行的所有后续API,放到While Controller内、CSV配置之后。这些API会自动读取当前用户的变量值。
7. 切换到下一个用户
在While Controller内的最后位置,添加JSR223 PostProcessor,更新循环索引:
def currentIndex = Integer.parseInt(vars.get("current_user_index")) vars.put("current_user_index", String.valueOf(currentIndex + 1)) // 重置CSV读取指针(如果CSV的计数器变量为csv_counter,可根据实际调整) vars.put("csv_counter", "0")
这一步会让下一次循环自动加载下一个用户的数据。
额外说明
- 临时调整测试用户时,只需要修改User Defined Variables里的
target_users字符串,无需改动其他逻辑。 - 若CSV中存在同一用户名的多行数据,过滤条件会匹配所有对应行,配合循环可处理同一用户的多组测试数据。
内容的提问来源于stack exchange,提问作者Joseph Quiñones
相关产品推荐
相关产品推荐

