You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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数组

适合循环发送请求或逐步构建数组的场景:

  1. 先在测试计划添加「用户定义的变量」,初始化input_items为空字符串
  2. 添加「循环控制器」,设置循环次数为CSV文件的行数(可通过JSR223 Sampler提前读取行数存入变量)
  3. 在循环控制器内的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}")
}
  1. 在循环外添加另一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:55:16