JMeter如何根据正则表达式提取的数组大小动态生成JSON请求块
JMeter动态生成可变数量JSON请求块实现方案
1. 前置提取配置
不管使用正则表达式后置处理器还是更推荐的JSON提取器,都要设置匹配数字为-1(提取所有匹配结果),此时JMeter会自动生成以下格式的变量:
- 总匹配数:
collectionId_matchNr、solutionId_matchNr,值为匹配到的ID总数量 - 单个匹配值:
collectionId_1、collectionId_2……collectionId_N,solutionId_1、solutionId_2……solutionId_N,对应第N个匹配到的ID值
2. 用JSR223前置处理器生成动态JSON数组
在需要发送动态请求的HTTP采样器下,新增JSR223前置处理器,语言选择Groovy,填入以下脚本:
// 生成动态collection块 def collectionCount = vars.get("collectionId_matchNr") as int def collectionList = [] for (i in 1..collectionCount) { def collItem = [ "CollectionId": vars.get("collectionId_${i}"), "StartTime": "替换为你需要的时间值/提取的对应变量", "EndTime": "替换为你需要的时间值/提取的对应变量", "ErrorCode": "*", "IsSuccess": true ] collectionList.add(collItem) } // 将生成的collection数组存入JMeter变量 vars.putObject("dynamicCollections", collectionList) // 生成动态solution块 def solutionCount = vars.get("solutionId_matchNr") as int def solutionList = [] for (i in 1..solutionCount) { def solItem = [ "SolutionId": vars.get("solutionId_${i}"), "Solution***": "替换为对应字段值", "SolutionVersion": "替换为对应版本值", "StartTime": "替换为你需要的时间值/提取的对应变量", "EndTime": "替换为你需要的时间值/提取的对应变量", "LastSyncUTC": "替换为对应的UTC时间值", "ErrorCode": "0", "IsSuccess": true ] solutionList.add(solItem) } // 将生成的solution数组存入JMeter变量 vars.putObject("dynamicSolutions", solutionList)
3. HTTP请求体直接引用动态变量
在HTTP采样器的请求Body中直接引用上面生成的变量即可,JMeter会自动将Groovy的List对象转换为标准JSON数组格式,无需手动处理逗号、括号等语法细节:
{ // 其他固定请求字段 "Collections": ${dynamicCollections}, "SolutionSyncLog": ${dynamicSolutions} // 其他固定请求字段 }
注意事项
- 若提取源是JSON响应,更推荐使用JSON提取器替代正则表达式后置处理器,不受JSON格式换行、空格变化影响,匹配稳定性更高,生成的变量格式和正则提取完全兼容上述脚本。
- 必须选择Groovy作为JSR223的执行语言,相比BeanShell性能提升数倍,高并发场景下优势更明显。
- 如果每个ID对应的StartTime、EndTime等字段也是独立值,可同步提取为
startTime_1、startTime_2这类带序号的变量,在循环中直接通过vars.get("startTime_${i}")调用即可。
内容的提问来源于stack exchange,提问作者Prateek
相关产品推荐
相关产品推荐

