JMeter如何在同一会话中基于JSR223提取的账号ID数组生成多个HTTP请求体
问题解答
关于Simple Controller的实现能力
Simple Controller本身仅作为采样器分组的逻辑容器,不具备循环执行的能力,无法单独实现遍历数组生成多请求的需求,需要配合ForEach控制器实现。
具体实现步骤
第一步:修改JSR223后置处理器代码
你原有代码循环覆盖了同一个accountId变量,导致最终仅保留最后一个值,需要调整为按ForEach控制器可识别的格式存储变量:def accountIds = [] for (int i=0; i < territoryTableDataList.size(); i++) { if (territoryTableDataList[i].change == "DROPPED") { accountIds.add(territoryTableDataList[i].id) } } // 存储数组长度供ForEach控制器识别 vars.put("accountId_matchNr", accountIds.size().toString()) // 按带索引的格式存储每个accountId for (int j=0; j < accountIds.size(); j++) { vars.put("accountId_" + (j+1), accountIds[j]) log.info("*******************The account ID is: " + accountIds[j]) }第二步:调整JMeter元件层级结构
按如下顺序排列元件:前置请求(生成territoryTableDataList的接口请求)
└── JSR223后置处理器(使用上述修改后代码)
ForEach控制器
└── 待测试的HTTP接口请求(可按需嵌套在Simple Controller内做分组)ForEach控制器配置项如下:
- 输入变量前缀填写:
accountId - 输出变量名称自定义,例如:
currentAccountId - 勾选「Add "_" before number?」选项
- 输入变量前缀填写:
第三步:调整HTTP请求体
把请求体内的${accountId}替换为ForEach控制器输出的变量${currentAccountId}即可,修改后的请求体如下:{ "globalRequestId": "auto-perftest-00", "challengeReasons": [ "other__c" ], "feedbackRemoveAccountRequests": [ { "requestId": "auto-perftest-001", "accountId": "${currentAccountId}" } ] }
补充说明
如果循环内仅需要执行单个HTTP请求,无需额外添加Simple Controller;如果循环内需要同时执行多个关联请求,可以用Simple Controller将这些请求分组,方便维护。
内容的提问来源于stack exchange,提问作者Zhang
相关产品推荐
相关产品推荐

