JMeter测试Azure部署OutSystems应用时事务重启重复登录问题求解
OutSystems AJAX应用JMeter重试逻辑配置方案
问题背景
- 测试对象为部署在Azure基础设施上的OutSystems应用,脚本录制捕获的所有请求均为AJAX调用,无传统HTML格式请求
- 目标实现逻辑:排除登录、登出操作的主事务集执行失败时,脚本从主事务起始位置重试,测试用户无需重复登录
- 已尝试配置及现存问题:
- 线程组已配置「采样器错误后执行动作 = 启动下一线程循环」,使用仅一次控制器(Only Once Controller)存放登录逻辑,但故障触发重启时仍然会重复执行登录
- 尝试将主事务放入运行时控制器(Runtime Controller),方案未生效
- 现有脚本结构参考:

配置失效根因
- Only Once Controller的执行逻辑是每个线程的每一次线程组完整迭代仅执行一次内部内容,配置出错后启动下一线程循环,相当于出错后直接开启了新的线程迭代,自然会重新触发Only Once Controller里的登录逻辑
- Runtime Controller仅用于控制内部元件的总执行时长,完全不具备错误重试、流程跳转的能力,无法实现重试控制需求
可行落地方案
方案1:While控制器+状态标记实现重试(最适配OutSystems AJAX场景,稳定性最高)
按以下层级调整脚本结构:
- 调整线程组基础配置:将「采样器错误后执行动作」修改为
Continue,禁止线程组级别触发循环跳转,避免打断自定义重试逻辑 - 第一层放置Only Once Controller:内部仅存放登录相关请求,登录成功后通过JSON提取器/正则提取器、Cookie管理器自动存储OutSystems会话必需的
osVisitor、csrfToken、会话Cookie等参数,这类参数在整个用户会话周期内有效,重试主事务时无需重新获取 - 第二层放置While控制器,所有主事务逻辑全部放在While控制器内部
- 给While控制器配置循环判断条件:
${__javaScript(("${TRANSACTION_SUCCESS}" != "true") && (${RETRY_COUNT} < 3),)},默认最多重试3次,可根据测试需求调整重试阈值,避免异常场景下无限循环卡线程 - While控制器内部、主事务逻辑最前端放置JSR223 Sampler做初始化:
// 初始化成功标记为失败 vars.put("TRANSACTION_SUCCESS", "false") // 重试计数+1 def retryCount = (vars.get("RETRY_COUNT") == null) ? 0 : Integer.parseInt(vars.get("RETRY_COUNT")) vars.put("RETRY_COUNT", String.valueOf(retryCount + 1)) // 清空上一次失败请求残留的临时参数,避免旧值干扰重试请求 vars.remove("TEMP_REQUEST_PARAM") // 其他主事务用到的临时变量按需清理 - 给主事务内所有请求添加响应断言:不要仅靠HTTP 200判断成功,OutSystems的AJAX接口经常出现HTTP 200但响应体携带业务错误标识的情况,需匹配响应中业务成功的固定标识(如
"success":true)判定请求真实成功 - 在主事务逻辑最后端添加JSR223 PostProcessor,所有主事务断言通过后标记成功:
// 所有主事务执行通过后标记成功,终止While循环 vars.put("TRANSACTION_SUCCESS", "true") // 重置重试计数,方便下一次正常业务迭代 vars.put("RETRY_COUNT", "0")
- 给While控制器配置循环判断条件:
- While控制器外部、脚本最末尾放置登出逻辑,不要将登出放入循环内
方案2:流控制动作(Flow Control Action)实现定向跳转(适合改动最小化场景)
如果不想大幅调整现有脚本结构,可以用这个方案:
- 同样先把线程组「采样器错误后执行动作」修改为
Continue,保留原有Only Once Controller存放登录的结构 - 给主事务内所有请求添加业务成功响应断言,每个请求后添加JSR223 PostProcessor标记失败状态:
if (!prev.isSuccessful()) { vars.put("RETRY_FLAG", "true") } - 在主事务集合的最末端添加Flow Control Action元件,配置为「跳转到指定采样器」,跳转目标选为主事务集合的第一个采样器,跳转判断条件设置为
${RETRY_FLAG} == "true" - 跳转前添加JSR223逻辑重置RETRY_FLAG为false、累计重试次数,达到最大重试次数后不再跳转,直接执行后续登出逻辑
OutSystems场景特殊注意事项
- 所有AJAX请求必须关联动态的视图状态、csrf令牌,这类参数如果是主事务流程内生成的,重试时需要重新从上个接口响应提取,不要复用失败请求里的旧值
- 不要在重试逻辑里加Cookie清理动作,会直接丢失登录态,导致重试时被拦截到登录页
- 如果测试过程中出现登录态过期的情况,可以在While控制器里加一个登录态校验的判断,仅当检测到登录失效时才触发一次登录逻辑,不需要每次重试都登录
内容的提问来源于stack exchange,提问作者Sachin Patel
相关产品推荐
相关产品推荐

