JMeter复杂场景测试求助:存储多POST响应并延迟执行GET请求
解决JMeter中POST响应值被覆盖的问题
问题核心是默认JSON Extractor每次提取会覆盖同名变量,得把100个POST的响应值分别存储,下面给两种可行方案:
方案一:用JSON Extractor的批量存储功能
这是最直接的方法,利用JMeter提取器的内置批量保存能力:
- 在POST请求的JSON Extractor里,设置
Reference Name为自定义名称(比如post_result) - 把
Match No.的值改成-1,JMeter会自动把每次POST提取到的值存为post_result_1、post_result_2……post_result_100,同时生成post_result_matchNr变量记录总数量(这里就是100) - 将GET请求放在Loop Controller中,设置循环次数为100
- 在GET请求的参数里,用
${__V(post_result_${__intSum(${__jm__Loop Controller__idx},1)})}引用对应索引的值:${__jm__Loop Controller__idx}是Loop Controller的内置索引(从0开始),用__intSum加1后,刚好对应post_result_1到post_result_100
方案二:用JSR223脚本手动管理值集合
如果需要更灵活的控制逻辑,用Groovy脚本存取值:
保存POST响应值(JSR223 PostProcessor挂在POST请求下)
// 替换成你实际从JSON Extractor拿到的变量名 def value = vars.get("extracted_value"); if (value) { // 从全局属性取存储列表,没有则新建 def valueList = props.get("post_response_list") ?: []; valueList.add(value); props.put("post_response_list", valueList); }
实现5分钟延迟
添加Test Action Sampler,设置Duration为300000(单位毫秒,对应5分钟),放在POST循环和GET循环之间。
获取对应值(JSR223 PreProcessor挂在GET请求下)
// 拿到当前Loop的索引(假设GET在Loop Controller里,循环100次) def loopIndex = vars.get("__jm__Loop Controller__idx") as int; def valueList = props.get("post_response_list"); if (valueList && loopIndex < valueList.size()) { // 把对应索引的值存到临时变量,供GET请求使用 vars.put("current_get_value", valueList.get(loopIndex)); }
- 最后在GET请求里用
${current_get_value}引用即可。
注意事项
- 如果是多线程执行,要注意线程安全,建议用
vars存储线程本地的列表,而非全局props - 确保POST和GET的循环次数一致(都是100),避免出现索引越界问题
内容的提问来源于stack exchange,提问作者iamdinesh007
相关产品推荐
相关产品推荐

