JMeter如何实现ForEach控制器提取的动态图片URL并行请求
JMeter动态未知数量图片资源并行加载方案
问题根因
原有脚本仅生成1个子请求、无法触发并行效果的核心原因有两点:
- 直接操作
sampler.data的写法仅适配HTTP Raw Request类采样器的静态配置逻辑,JSR223预处理器运行时,采样器的请求队列已经完成初始化,循环追加的内容不会被并行执行引擎识别,仅会识别到单个URL参数发起请求 - 逻辑中把多段路径拼接为单个长字符串后再做逗号分割的方式存在变量覆盖风险,且固定配置的Parallel Controller本身不支持运行时动态增减子请求数量,必须提前配置固定子请求数,和未知资源总量的场景不匹配。
落地实现步骤
1. 调整资源收集逻辑
保留ForEach循环中Flexible File Writer的资源收集逻辑,调整输出格式:确保CSV中存储的图片路径参数为逗号分隔的纯路径段,不要提前和域名、鉴权参数拼接为完整URL,减少后续分割、转义异常。
删除原有JSR223预处理器中直接修改采样器属性的代码,替换为JSR223取样器(放置位置为之前放预处理器的节点,即主请求执行完成后的位置),使用如下Groovy脚本动态生成并行请求:
import org.apache.jmeter.protocol.http.sampler.HTTPSamplerFactory import com.blazemeter.jmeter.controller.ParallelSampler import java.net.URL // 读取上下文中的参数 def pathTokens = vars.get("tokens").split(",") def authToken = vars.get("Token") def baseDomain = "stagingassets.ovid.com" def protocol = "https" def concurrency = 6 // 匹配Chrome同域默认并发连接数,可按需调整 // 组装所有待加载的图片URL def imgUrls = [] pathTokens.each { token -> imgUrls.add("${protocol}://${baseDomain}/${token}/t/width-150-png?${authToken}") } // 动态初始化并行采样器,无需提前配置固定子请求数量 def parallelLoader = new ParallelSampler() parallelLoader.setName("并行加载页面图片资源") parallelLoader.setMaxConcurrency(concurrency) parallelLoader.setParallelizeChildren(true) // 遍历URL列表,动态添加子HTTP请求 imgUrls.each { imgUrl -> def url = new URL(imgUrl) def imgSampler = HTTPSamplerFactory.newInstance(HTTPSamplerFactory.DEFAULT_IMPL) // 配置请求基础属性 imgSampler.setDomain(url.getHost()) imgSampler.setPort(url.getPort() == -1 ? (url.getProtocol() == "https" ? 443 : 80) : url.getPort()) imgSampler.setProtocol(url.getProtocol()) imgSampler.setPath(url.getPath()) imgSampler.setQueryString(url.getQuery()) imgSampler.setMethod("GET") imgSampler.setFollowRedirects(true) imgSampler.setName("图片请求: ${url.getPath()}") // 自动继承当前线程的Cookie、请求头、鉴权配置 parallelLoader.addTestElement(imgSampler) } // 将动态生成的并行采样器加入当前执行上下文 def currentThreadGroup = ctx.getThreadGroup() currentThreadGroup.addTestElement(parallelLoader) parallelLoader.setRunningVersion(true) parallelLoader.traverse(ctx.getSamplerContext())
2. 配置调优说明
- 无需提前在测试计划中添加固定数量的HTTP请求或静态Parallel Controller,脚本运行时会根据实际采集到的URL数量自动生成对应子请求,完全适配资源数量动态变化的场景
- 并发参数参考真实浏览器同域连接上限设置即可,不要设置过高避免和真实用户行为偏差:Chrome/Edge同域默认并发为6,Firefox为8,旧版IE为2-4
- 若需要采集图片请求的成功率、响应时间等指标,直接给该JSR223取样器添加对应监听器即可,动态生成的采样器指标采集逻辑和静态配置完全一致
- 若存在跨域图片资源,脚本中补充对应域名、协议的判断逻辑即可,不需要修改整体框架。
3. 效果校验
执行测试后在察看结果树中可观测到:
- 主请求执行完成后,自动发起的图片请求数量和采集到的资源数量完全一致
- 所有图片请求按配置的并发度并行发出,不存在串行排队等待
- 请求自动携带当前上下文的Cookie、鉴权头,和浏览器原生加载图片的行为完全匹配。
内容的提问来源于stack exchange,提问作者Sandeep Rao Tandra
相关产品推荐
相关产品推荐

