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

JMeter:基于用户定义变量实现多用户令牌并发HTTP请求

解决Foreach Controller无法并发发起API请求的方案

下面是三种可行的实现方式,根据你的测试场景选择:

方式一:拆分线程组实现并发

  • 先在登录流程中,将每个用户的令牌保存到JMeter全局属性中,比如在登录请求的JSR223 PostProcessor中添加代码:
    int index = Integer.parseInt(vars.get("__jm__Foreach Controller__idx"));
    props.put("token_" + index, vars.get("token"));
    
  • 创建一个新线程组,将线程数设置为${numberOfUsers},确保该线程组在登录线程组之后执行(测试计划中勾选「独立运行每个线程组」)
  • 在新线程组的HTTP请求中,用${__P(token_${__threadNum},)}获取对应线程的令牌,填入请求头或参数中发起API请求

方式二:使用JSR223 Sampler + Java线程池

  • 先汇总所有令牌到一个列表变量:在Foreach Controller结束后,添加JSR223 PostProcessor执行以下代码:
    List<String> tokenList = new ArrayList<>();
    int userCount = Integer.parseInt(vars.get("numberOfUsers"));
    for (int i = 0; i < userCount; i++) {
        tokenList.add(vars.get("token_" + i));
    }
    vars.putObject("tokenList", tokenList);
    
  • 添加JSR223 Sampler,用Java线程池实现并发请求:
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    
    List<String> tokens = vars.getObject("tokenList");
    ExecutorService executor = Executors.newFixedThreadPool(Integer.parseInt(vars.get("numberOfUsers")));
    
    for (String token : tokens) {
        executor.submit(() -> {
            CloseableHttpClient client = HttpClients.createDefault();
            try {
                HttpPost request = new HttpPost("你的目标API地址");
                request.addHeader("Authorization", "Bearer " + token);
                // 按需添加请求体、其他请求头
                client.execute(request);
                // 可添加响应日志或结果处理逻辑
            } catch (Exception e) {
                log.error("API请求失败", e);
            } finally {
                client.close();
            }
        });
    }
    
    executor.shutdown();
    executor.awaitTermination(5, TimeUnit.MINUTES); // 设置合理的超时时间
    

方式三:CSV文件中转+多线程读取

  • 在登录请求的JSR223 PostProcessor中,将每个令牌写入CSV文件:
    FileWriter writer = new FileWriter("tokens.csv", true);
    writer.write(vars.get("token") + "\n");
    writer.close();
    
  • 创建新线程组,线程数设为${numberOfUsers},添加CSV数据集配置:
    • 文件路径选择刚才生成的tokens.csv
    • 变量名设为currentToken
  • 在该线程组的HTTP请求中,使用${currentToken}作为令牌发起请求,同样要确保登录线程组先执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 20:37:41