分布式JMeter环境下如何将CSV变量传递给Azure后端监听器
问题描述
在JMeter分布式测试环境中,需要从CSV Data Config读取变量传入后端监听器,相同配置在本地运行正常,但在分布式环境下失效。
测试计划结构:线程组下挂载CSV Data Config、JDBC请求、后端监听器。
CSV Data Config配置:按行读取CSV文件内容,以分号为分隔符,映射为QUERY和QUERY_TYPE两个变量。
CSV文件内容示例:
SELECT count(*) FROM github_events;simpleQuery SELECT count(*) FROM github_events;medium SELECT count(*) FROM github_events;complexQuery SELECT count(*) FROM github_events;simpleQuery
原先的实现方案:在BeanShell预处理器中通过以下代码设置全局属性,再在后端监听器中通过${__P(query)}、${__P(query_type)}引用:
props.put("query", "${QUERY}"); props.put("query_type", "${QUERY_TYPE}");
该方案失效的核心原因是JMeter分布式环境下各worker节点的props属性独立,且多线程迭代时属性值会被覆盖,无法和单个采样请求的变量一一对应。
解决方案
可通过以下变通方案实现需求,适配当前使用场景:
在JDBC Request下添加JSR223 Postprocessor,写入如下Groovy代码:
import groovy.json.* def my_query = vars.get("QUERY") def my_query_type = vars.get("QUERY_TYPE") json = JsonOutput.toJson([myQuery: my_query, myQueryType: my_query_type]) prev.setSamplerData(groovy.json.JsonOutput.prettyPrint(groovy.json.JsonOutput.toJson(json)))
注意事项
- 该方案会覆盖采样器原有Sampler Data,若需要保留原始采样数据则不适用
- 该配置默认仅在分布式测试环境下生效,若要在本地环境运行,将
prev.setSamplerData替换为prev.setResponseData
内容的提问来源于stack exchange,提问作者ards
相关产品推荐
相关产品推荐

