如何在JMeter的JSON POST请求中关联匹配两个CSV文件的变量
JMeter 按公司ID匹配Profile批量生成请求方案
全程无需Java编码,所有脚本可直接复制使用,仅需修改对应文件路径即可。
测试计划层级结构参考
你可以按照以下层级添加对应组件:
- 测试计划
- 线程组(按需求设置并发用户数、循环次数)
- CSV数据集配置(读取用户登录信息)
- JSR223 前置处理器(全局预加载Profile数据,仅执行1次)
- 登录接口请求(你已有的登录配置保持不变)
- JSR223 前置处理器(生成当前用户对应Profile的JSON数组)
- 生成报告POST请求
- 线程组(按需求设置并发用户数、循环次数)
步骤1:配置用户登录CSV数据集
右键线程组添加 -> 配置元件 -> CSV数据集配置,参数设置如下:
- 文件名:选择你存储userid、companyid、password的CSV文件路径
- 变量名称:
userid,companyid,password - 分隔符:
, - 勾选每次迭代重新读取、在所有线程间共享,其余选项保持默认即可。
步骤2:配置全局Profile预加载脚本
右键线程组添加 -> 前置处理器 -> JSR223 前置处理器,脚本语言选择Groovy,将以下脚本复制到输入框中,仅需修改profile CSV的路径:
// 测试启动时仅执行1次,避免重复加载数据 if (props.get("profilesLoaded") != "true") { // 替换为你第二个存储profileid、companyid的CSV文件绝对路径 def profileCsvPath = "C:/xxx/xxx/profiles.csv" def companyProfileMap = [:] new File(profileCsvPath).eachLine { line, lineNum -> // 跳过CSV表头行,如果你没有表头就删掉这行 if (lineNum == 1) return def fields = line.split(",").collect { it.trim() } def pid = fields[0] def cid = fields[1] // 按companyid分组存储所有对应profileid if (!companyProfileMap.containsKey(cid)) { companyProfileMap.put(cid, []) } companyProfileMap.get(cid).add(pid) } // 存储到全局属性,所有线程共用 props.put("companyProfileMap", companyProfileMap) props.put("profilesLoaded", "true") }
步骤3:配置Profile数组生成脚本
在你的生成报告POST请求前,添加一个JSR223 前置处理器,同样选择Groovy语言,复制以下脚本:
// 读取当前登录用户的companyid def currentCompanyId = vars.get("companyid") // 从全局分组数据中拿到对应所有profileid def matchedProfiles = props.get("companyProfileMap").get(currentCompanyId) // 直接生成JSON数组格式的字符串存入变量 def jsonArray = new groovy.json.JsonBuilder(matchedProfiles).toString() vars.put("profileJsonArray", jsonArray)
执行完该脚本后,你会得到一个名为profileJsonArray的变量,里面就是当前用户所有符合要求的profileid组成的JSON数组。
步骤4:配置POST请求体
在生成报告的POST请求的Body Data中,直接引用变量即可,示例结构如下:
{ "userId": "${userid}", "reportType": "custom", "profiles": ${profileJsonArray} }
不需要做任何循环处理,不管符合条件的profile有多少条,都会一次性全部填入数组中。
注意事项
- 两个CSV文件不要包含多余空行,确保字段分隔符为英文逗号
- 如果你不需要跳过CSV表头,将步骤2脚本中的
if (lineNum == 1) return删掉即可 - Groovy为JMeter默认支持的脚本语言,不需要额外安装任何插件
内容的提问来源于stack exchange,提问作者simón
相关产品推荐
相关产品推荐

