Gatling中doIf语句的then块始终执行问题求助
解决Gatling登录场景条件判断失效问题
核心问题分析
你的代码逻辑完全写反了:你期望仅当环境需要登录时执行登录,但当前doIf的判断条件是!environment.needsLogin && session.getString(TOKEN_KEY).isNullOrEmpty()——这意味着环境不需要登录时反而会触发登录逻辑,这就是then块始终执行的原因。
修复步骤
修正条件逻辑
将doIf的判断条件改为environment.needsLogin && session.getString(TOKEN_KEY).isNullOrEmpty(),只有当环境明确需要登录,且会话中没有有效令牌时,才执行登录流程。处理空指针风险
当前environment.loginUrl设为null,执行post(environment.loginUrl!!)会直接抛出空指针异常,需要在代码中增加安全校验。可选:添加日志验证
可以在doIf中加入日志输出,直观确认条件判断结果,方便调试。
修正后的完整代码
val environment = object Local : Environment( url = "http://localhost:8080/", loginUrl = null, needsLogin = false ) fun login() = doIf { session -> // 仅当环境需要登录且会话无令牌时执行登录 val shouldLogin = environment.needsLogin && session.getString(TOKEN_KEY).isNullOrEmpty() println("是否执行登录: $shouldLogin") // 调试用日志 shouldLogin }.then(authenticationLogin()) private val loginBody = LoginBody( System.getenv("CI_PERFORMANCE_TEST_EMAIL") ?: "email", System.getenv("CI_PERFORMANCE_TEST_PASSWORD") ?: "pass" ) fun authenticationLogin() = exec( http("POST Authentication") // 增加URL非空校验,避免空指针 .post(environment.loginUrl ?: error("登录URL未配置,无法执行登录")) .formParam(EMAIL, loginBody.email) .formParam(PASSWORD, loginBody.password) .check(bodyString().saveAs("authResponse")) )
验证方法
将environment.needsLogin设为false时,doIf条件不满足,then块不会执行;设为true且会话无令牌时,才会触发登录请求。
内容的提问来源于stack exchange,提问作者Roberto
相关产品推荐
相关产品推荐

