JMeter中如何实现API返回COMPLETED时仅执行一次End Ride API并停止?
解决打车预订JMeter测试中End Ride API的执行控制问题
我在打车预订应用的JMeter测试场景中,需要在API响应返回COMPLETED状态时,仅执行一次End Ride API并停止后续执行。目前用While控制器实现时出现了无限循环问题。
已通过jsonlint.com验证的API响应:
{"id":3820,"status":"COMPLETED","rider":{"id":2019,"firstname":"test","lastname":"rider","phoneNumber":"9000000124","email":"Test_rider_10002@popp1.com","rating":5.0,"user":{},"fullName":"test rider"},"startLocationLat":36.10805389068134,"startLocationLong":-115.16570490025539,"endLocationLat":36.10805389068134,"endLocationLong":-115.16570490025539,"startAddress":"73 South Martin Luther King Boulevard","endAddress":"920 West Bonanza Road","start":{"address":"73 South Martin Luther King Boulevard","zipCode":"89106"},"end":{"address":"920 West Bonanza Road"},"surgeFactor":1.00,"driverPayment":"4.00","requestedCarType":{"title":"STANDARD","carCategory":"REGULAR","plainIconUrl":"https://media.ride-vegas.com/regular.png","configuration":"{\"skipRideAuthorization\": false}"},"requestedDriverTypes":[],"freeCreditCharged":"0.00"}
当前实现代码与问题
JSR223采样器代码(放在While控制器内)
import groovy.json.JsonSlurper; def jsonSlurper = new JsonSlurper(); def apiDetails = new groovy.json.JsonSlurper().parse(current.getResponseData()) def eventStatus=apiDetails.status def shouldRun = "1" if(eventStatus =="COMPLETED") { shouldRun = "0" } vars.put("shouldRun", shouldRun+"") log.info("shouldRun: " + vars.get("shouldRun"));
While控制器条件
${__jexl3("${shouldRun}" != "0" && ${__jm__While Controller__idx} < 2,)}
修复方案
问题核心
shouldRun变量每次进入循环都会被重置为"1",即使之前因状态为COMPLETED设置为"0",也会被覆盖,导致循环无法终止。- 循环条件里的次数限制逻辑冗余,且无法精准匹配"状态达标即执行一次End Ride并停止"的需求。
正确实现步骤
- 初始化变量:在While控制器外部添加JSR223采样器,仅初始化一次
shouldRun:
vars.put("shouldRun", "1")
- 修改循环内的JSR223采样器代码:去掉每次重置
shouldRun的逻辑,仅在状态为COMPLETED时更新变量:
import groovy.json.JsonSlurper def apiDetails = new JsonSlurper().parse(current.getResponseData()) def eventStatus = apiDetails.status if (eventStatus == "COMPLETED") { vars.put("shouldRun", "0") } log.info("shouldRun: " + vars.get("shouldRun"))
- 调整While控制器条件:仅保留
shouldRun的判断,确保状态达标后立即终止循环:
${__jexl3("${shouldRun}" != "0",)}
- 精准控制End Ride API执行:在While控制器内,将End Ride API请求放在JSR223采样器之后,添加If控制器,条件设为:
${__jexl3("${shouldRun}" == "0",)}
这样只有当状态变为COMPLETED时,才会执行一次End Ride API。
执行流程说明
- 初始化
shouldRun为"1" - 进入While循环,调用查询订单状态的API
- JSR223采样器解析响应,若状态为COMPLETED则将
shouldRun设为"0" - If控制器检测到
shouldRun为"0",执行End Ride API - 下一轮循环时,While控制器判断
shouldRun为"0",直接终止循环
内容的提问来源于stack exchange,提问作者Snehal Matharu
相关产品推荐
相关产品推荐

