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

如何在JMeter中动态加载GraphQL查询以实现Azure负载测试

实现JMeter动态加载GraphQL测试用例并对接Azure Load Testing

一、动态加载.graphql查询与.test.json测试数据

1. 批量管理测试用例元数据

先整理所有测试用例的路径映射成CSV文件(比如test-cases.csv),每行记录对应关系:

test_json_path,graphql_query_path,query_name
./tests/getUser.test.json,./queries/getUser.graphql,GetUser
./tests/listOrders.test.json,./queries/listOrders.graphql,ListOrders

在JMeter中添加CSV Data Set Config,配置:

  • 文件名:填写test-cases.csv的路径
  • 变量名:TEST_JSON_PATH,GRAPHQL_QUERY_PATH,QUERY_NAME
  • 分隔符:逗号
  • 循环规则:按需勾选"Stop thread on EOF"或设置循环次数

2. 读取GraphQL查询内容

添加JSR223 Sampler,用Groovy脚本读取.graphql文件并存储为变量:

def queryFile = new File(vars.get("GRAPHQL_QUERY_PATH"))
vars.put("GRAPHQL_QUERY", queryFile.text.trim())

3. 解析测试用例的变量与断言

再添加一个JSR223 Sampler,解析.test.json文件提取变量和断言规则:

import groovy.json.JsonSlurper
import groovy.json.JsonBuilder

def jsonFile = new File(vars.get("TEST_JSON_PATH"))
def testData = new JsonSlurper().parse(jsonFile)

// 序列化请求变量为JSON字符串
vars.put("REQUEST_VARIABLES", new JsonBuilder(testData.variables).toString())

// 存储断言规则到JMeter变量
testData.assertions.eachWithIndex { assertion, idx ->
    vars.put("ASSERT_FIELD_${idx}", assertion.field)
    vars.put("ASSERT_VALUE_${idx}", assertion.expectedValue.toString())
    vars.put("ASSERT_COUNT", testData.assertions.size().toString())
}

假设.test.json的结构如下:

{
  "queryName": "GetUser",
  "variables": { "userId": 123 },
  "assertions": [
    { "field": "user.name", "expectedValue": "John Doe" },
    { "field": "user.status", "expectedValue": "ACTIVE" }
  ]
}

二、配置GraphQL HTTP请求

修改现有HTTP请求的参数:

  • 请求方法:POST
  • 目标URL:你的GraphQL API地址
  • 请求头:添加Content-Type: application/json
  • 请求体:
{
  "query": "${GRAPHQL_QUERY}",
  "variables": ${REQUEST_VARIABLES},
  "operationName": "${QUERY_NAME}"
}

三、动态执行断言

用JSR223 Assertion实现批量断言,避免手动添加断言元件:

import groovy.json.JsonSlurper

def response = new JsonSlurper().parseText(prev.getResponseDataAsString())
def assertionCount = Integer.parseInt(vars.get("ASSERT_COUNT"))

for (int i = 0; i < assertionCount; i++) {
    def field = vars.get("ASSERT_FIELD_${i}")
    def expectedValue = vars.get("ASSERT_VALUE_${i}")
    // 按字段路径拆分取值,比如"user.name"拆成["user", "name"]
    def fieldPath = field.split("\\.")
    def actualValue = response.data
    fieldPath.each { node ->
        actualValue = actualValue[node]
    }
    // 对比预期值与实际值
    if (actualValue.toString() != expectedValue) {
        AssertionResult.setFailure(true)
        AssertionResult.setFailureMessage("断言失败:字段${field}预期值${expectedValue},实际值${actualValue}")
    }
}

四、对接Azure Load Testing

  1. 打包测试资源:将JMeter测试计划(.jmx)、test-cases.csv、所有.graphql和.test.json文件压缩成ZIP包
  2. 创建Azure测试:登录Azure Load Testing门户,新建测试并上传ZIP包
  3. 配置负载参数:设置并发用户数、测试持续时间、 ramp-up时间等
  4. 运行与同步:启动测试后可查看Azure提供的负载指标;后续更新测试用例时,只需替换本地文件重新打包上传即可同步

五、优化建议

  • 用User Defined Variables统一管理API地址、环境标识等全局参数
  • 本地调试时添加View Results Tree和Summary Report元件查看执行细节
  • 若需循环执行所有用例,可结合Loop Controller与CSV循环配置实现批量运行

内容的提问来源于stack exchange,提问作者Nathan Wesley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:05:25