JMeter提取器多匹配结果处理:随机传递contentType与id键值对
JMeter随机选取JSON提取结果的解决方案
Hey,我来帮你搞定这个JMeter的问题!你需要用JSR223 PostProcessor(这是JMeter官方现在更推荐的后置处理器,比BeanShell性能更好、语法更灵活)来实现随机选取一组(contentType, id)键值对的需求,下面是具体的步骤和修正后的方案:
一、为什么不推荐继续用BeanShell?
你之前尝试BeanShell没成功,主要是代码里有语法错误(比如用了大括号{}代替小括号()调用方法),而且BeanShell的性能和对新语法的支持都不如Groovy,直接换用JSR223+Groovy会更顺畅。
二、具体实现步骤
1. 配置JSR223 PostProcessor
把JSR223 PostProcessor添加到你的JSON Path Extractor所在的Sampler下面,确保它在JSON Path Extractor之后执行(JMeter默认按顺序执行后置处理器)。
2. 编写Groovy脚本
在JSR223 PostProcessor的「Script」框里输入以下代码:
// 收集所有提取到的IDType_Extract_N变量 def extractResults = [] def index = 1 // 循环获取所有存在的提取变量 while (vars.get("IDType_Extract_" + index) != null) { extractResults.add(vars.get("IDType_Extract_" + index)) index++ } // 随机选取其中一组结果 if (extractResults.size() > 0) { def randomPicker = new Random() def selectedResult = extractResults[randomPicker.nextInt(extractResults.size())] // 用Groovy的JsonSlurper解析JSON字符串(比手动拆分字符串更可靠) def jsonParser = new groovy.json.JsonSlurper() def parsedData = jsonParser.parseText(selectedResult) // 将解析出的值存入新变量,供后续HTTP请求使用 vars.put("target_contentType", parsedData.contentType) vars.put("target_id", parsedData.id.toString()) } else { // 如果没有提取到结果,打印警告日志 log.warn("Warning: No valid results found from JSON Path Extractor!") }
3. 验证变量
添加一个Debug Sampler到测试计划中,运行测试后查看target_contentType和target_id这两个变量,就能看到随机选中的键值对了。后续的HTTP请求直接用${target_contentType}和${target_id}引用即可。
三、纠正你之前的BeanShell错误
你之前的代码有两个关键语法错误:
- 获取变量应该用
vars.get("变量名"),而不是vars.get{"变量名"}(方法调用必须用小括号) - 字符串拆分的正确写法是
value.split(","),同样要用小括号,而且手动拆分JSON字符串容易出错(比如遇到带逗号的字符串值),所以用JSON解析器更稳妥。
内容的提问来源于stack exchange,提问作者Amu
相关产品推荐
相关产品推荐

