如何通过迭代groupBuilderMap创建Gatling ScenarioBuilder并维持会话
Gatling会话丢失问题解决方案
你遇到的问题核心在于ChainBuilder数组未正确合并为可执行链,以及可能存在的group执行顺序不确定,导致后续组无法继承会话属性。以下是具体修改方案:
1. 修正ScenarioBuilder构建逻辑
将数组中的多个ChainBuilder合并为单一可执行链,确保会话能在所有步骤间正常传递:
protected ScenarioBuilder createScenario(GatlingScenario scenario) { Map<String, ChainBuilder[]> groupBuilderMap = scenario.getGroupChainBuilderMap(); ScenarioBuilder scenarioBuilder = scenario(scenario.getScenarioName()) .exec(session -> session .setAll(Map.of("timeStamp", LocalDateTime.now(), "baseUrl", this.baseUrl))); for (Map.Entry<String, ChainBuilder[]> entry : groupBuilderMap.entrySet()) { String groupName = entry.getKey(); ChainBuilder[] chainBuilders = entry.getValue(); // 用Stream合并数组中的ChainBuilder为单一链 ChainBuilder groupChain = Arrays.stream(chainBuilders) .reduce(chain(), ChainBuilder::exec); // 将group添加到场景中 scenarioBuilder = scenarioBuilder .group(groupName) .on(groupChain); } return scenarioBuilder; }
2. 保证Group执行顺序
HashMap的遍历顺序是不确定的,如果需要严格按照「登录组→添加项组」的顺序执行,需改用LinkedHashMap维护插入顺序:
Map<String, ChainBuilder[]> gpNameChainBuilderMap = Stream.of( Map.entry("Login Group", loginChainBuilder), Map.entry("AddItemGroup", addItemChainbuilder) ).collect(Collectors.toMap( Map.Entry::getKey, Map.Entry::getValue, (oldVal, newVal) -> oldVal, LinkedHashMap::new ));
3. 验证会话属性引用
确保你的步骤中正确引用会话属性,比如使用Gatling的EL表达式${baseUrl},或者通过Session API获取:
// 示例:在请求中使用会话属性 http("Get Item") .get("${baseUrl}/items") .header("Authorization", session -> session.get("token").toString());
这样修改后,会话属性就能在所有group的步骤中正常传递,后续组的步骤也能正确解析会话数据。
内容的提问来源于stack exchange,提问作者Alferd Nobel
相关产品推荐
相关产品推荐

