如何在JMeter中根据CSV设备数量动态生成GraphQL变量?
在JMeter中动态生成GraphQL变量的实现方案
完全可以实现,具体操作步骤如下:
1. 准备设备数据CSV文件
新建CSV文件(例如devices.csv),每行存储一个设备的pointId;如果不同设备的ConnectionString有差异,也可以增加对应列。示例格式:
# 单列(ConnectionString固定) deviceId1 deviceId2 deviceIdN # 多列(ConnectionString随设备变化) connectionString1,deviceId1 connectionString2,deviceId2 connectionStringN,deviceIdN
2. 添加CSV数据读取组件
在线程组下添加「CSV Data Set Config」:右键线程组 → 添加 → 配置元件 → CSV Data Set Config
配置核心参数:
- 「文件名」:填写CSV文件的绝对/相对路径(例如
./devices.csv) - 「变量名称」:单列填
pointId;多列填connectionString,pointId - 「分隔符」:逗号
, - 「遇到文件结束符时循环」:按需选择(遍历所有设备选
True,仅执行一次选False) - 「线程共享模式」:根据并发需求选择,默认选「所有线程」
3. 用JSR223 PreProcessor动态生成JSON变量
在GraphQL请求前置位置添加「JSR223 PreProcessor」:右键请求 → 添加 → 前置处理器 → JSR223 PreProcessor,选择语言为Groovy(性能最优),根据需求选择两种实现方式:
方式1:一次性生成所有设备的Input数组
适合需要把所有设备数据一次性打包发送的场景:
// 初始化存储设备对象的列表 def inputList = [] // 读取CSV文件所有行 def csvLines = new File("./devices.csv").readLines() csvLines.each { line -> def parts = line.split(",") // 取ConnectionString:固定值用全局变量,CSV中读取则用parts[0] def connStr = vars.get("connectionString") // 取pointId:单列用parts[0],多列用parts[1] def pointId = parts[0] // 构建单个设备的JSON结构 def deviceItem = [ "ConnectionString": connStr, "data": [ "pointId": pointId, "commandData": "{\"AccessControl\":\"Readonly\"}" ] ] inputList.add(deviceItem) } // 转为完整的GraphQL变量JSON,存入JMeter变量 def finalVariables = new groovy.json.JsonBuilder([input: inputList]).toString() vars.put("graphql_vars", finalVariables)
方式2:循环拼接生成Input数组
适合循环发送请求或逐步构建数组的场景:
- 先在测试计划添加「用户定义的变量」,初始化
input_items为空字符串 - 添加「循环控制器」,设置循环次数为CSV文件的行数(可通过JSR223 Sampler提前读取行数存入变量)
- 在循环控制器内的JSR223 PreProcessor中编写拼接逻辑:
def connStr = vars.get("connectionString") def pointId = vars.get("pointId") // 构建单个设备的JSON字符串(注意转义双引号) def deviceJson = "{\"ConnectionString\":\"${connStr}\",\"data\":{\"pointId\":\"${pointId}\",\"commandData\":\"{\\\"AccessControl\\\":\\\"Readonly\\\"}\"}}" def currentItems = vars.get("input_items") // 拼接成数组元素串 if (currentItems.isEmpty()) { vars.put("input_items", deviceJson) } else { vars.put("input_items", "${currentItems},${deviceJson}") }
- 在循环外添加另一个JSR223 PreProcessor,组装完整变量:
def fullVars = "{\"input\":[${vars.get("input_items")}]}" vars.put("graphql_vars", fullVars)
4. 在GraphQL请求中引用变量
在GraphQL请求的「Body Data」中直接引用生成的变量:
${graphql_vars}
如果使用JMeter的「GraphQL Query」组件,在「Variables」字段填写${graphql_vars}即可。
5. 验证结果
添加「查看结果树」组件,运行测试后检查请求Body,确认input数组的元素数量和内容与CSV数据一致。
内容的提问来源于stack exchange,提问作者Seirra
相关产品推荐
相关产品推荐

