You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMeter技术问询:混合串行并行线程组及动态线程组实现

JMeter测试计划问题解答

1. 单个测试计划中实现部分线程组串行、部分并行

可以实现,核心通过全局属性标记+线程组执行条件控制来达成:

  • 测试计划默认不勾选「Run Thread Groups Consecutively」(线程组默认并行),先让创建用户的线程组优先执行
  • 在创建用户的线程组末尾添加JSR223 Sampler,执行代码标记用户创建完成:
    props.put("userCreated", "true")
    
  • 对需要在用户创建后才执行的线程组(如创建org的线程组),添加Test Action控制器,设置Condition为:
    ${__jexl3(props.get("userCreated") == "true",)}
    
  • 需要并行运行的线程组(如发送高并发请求的线程组),同样添加上述Test Action控制器,它们会在用户创建完成后同时启动,实现部分串行+部分并行的效果。

2. 根据创建的org数量动态定义线程组

可以通过JMeter的Groovy API在运行时动态生成线程组,步骤如下:

  • 先在创建org的线程组中,用正则表达式提取器把每个org的标识(如ID)保存为org_1、org_2这类变量,并将org总数存入全局属性:
    def orgCount = vars.get("matchNr") // matchNr是正则提取器返回的匹配数量
    props.put("orgCount", orgCount)
    
  • 添加JSR223 Sampler,编写Groovy代码动态创建线程组,示例:
    def orgCount = Integer.parseInt(props.get("orgCount"))
    def testPlan = ctx.getTestPlan()
    
    // 创建动态线程组
    def dynamicTG = new org.apache.jmeter.threads.ThreadGroup()
    dynamicTG.setName("Org Request Thread Group")
    dynamicTG.setNumThreads(orgCount) // 线程数与org数量一致
    dynamicTG.setRampUp(1) // 快速启动所有线程
    dynamicTG.setSamplerController(new org.apache.jmeter.control.LoopController())
    
    // 创建请求采样器(以HTTP请求为例)
    def httpSampler = new org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy()
    httpSampler.setDomain("你的目标域名")
    httpSampler.setPath("你的请求路径")
    httpSampler.setMethod("POST")
    // 绑定当前线程对应的org ID
    httpSampler.addArgument("orgId", "${__V(org_${__threadNum})}")
    
    // 将采样器添加到线程组控制器
    dynamicTG.getSamplerController().addTestElement(httpSampler)
    // 将动态线程组加入测试计划
    testPlan.addThreadGroup(dynamicTG)
    // 重新配置测试引擎使新线程组生效
    ctx.getEngine().configure(testPlan)
    
  • 注意:这段代码需在所有org创建完成后执行,确保orgCount和org_*变量已生成。

跟踪子用户并修改参数值

通过JMeter全局属性存储所有子用户(org)信息,方便后续修改:

  • 在创建org的线程组中,将所有org信息存入全局属性的List:
    def orgList = []
    def count = Integer.parseInt(vars.get("matchNr"))
    for (int i=1; i<=count; i++) {
        orgList.add(vars.get("org_" + i))
    }
    props.put("orgList", orgList)
    
  • 需要修改参数时,在任意JSR223 Sampler中读取List并修改对应属性,示例:
    def orgList = props.get("orgList")
    // 修改第一个org的自定义参数
    props.put("org_1_custom_param", "新值")
    
  • 在请求采样器中直接引用修改后的属性即可,如${__P(org_1_custom_param,)}。

内容的提问来源于stack exchange,提问作者Vaibhav Saxena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 11:08:36