如何在Gatling中设置全局变量或使用Getter/Setter共享登录Token
在Gatling中实现模块化Token共享方案
核心思路:利用Gatling Session存储用户级Token
Gatling每个虚拟用户都有独立的Session对象,用来存储用户专属状态数据(比如登录Token),和你在Locust里用user_attr存储的逻辑完全对应。我们可以通过提取Token到Session,再在其他模块中从Session读取,同时封装工具类简化Getter/Setter操作。
步骤1:封装Token操作工具类(全局复用)
新建TokenUtils.scala文件,统一Token的存取逻辑:
object TokenUtils { // 定义Session中存储Token的键名 private val TOKEN_KEY = "BearerToken" // Setter:将Token存入Session def setToken(token: String) = { session => session.set(TOKEN_KEY, token) } // Getter:从Session中获取Token,返回Option避免空值 def getToken(session: Session): Option[String] = { session(TOKEN_KEY).asOption[String] } // 生成带Token的Authorization请求头 def getAuthHeader(session: Session): Map[String, String] = { getToken(session) match { case Some(token) => Map("Authorization" -> s"Bearer $token") case None => Map.empty // 无Token时返回空,也可根据业务抛出错误终止流程 } } }
步骤2:登录模块(提取并存储Token)
新建LoginScenario.scala,处理登录逻辑并调用工具类存储Token:
import io.gatling.core.Predef._ import io.gatling.http.Predef._ import TokenUtils._ object LoginScenario { val login = scenario("用户登录") .exec( http("登录请求") .post("/api/login") .formParam("username", "testUser") .formParam("password", "testPass") .check(jsonPath("$.data.token").saveAs("tempToken")) // 先临时存储到Session ) .exec(session => { val token = session("tempToken").as[String] setToken(token)(session) // 调用工具类存入正式键名 }) }
步骤3:业务模块(读取Token)
新建ProfileScenario.scala,从Session读取Token并用于请求:
import io.gatling.core.Predef._ import io.gatling.http.Predef._ import TokenUtils._ object ProfileScenario { val getProfile = scenario("获取用户信息") .exec( http("获取用户资料") .get("/api/profile") .headers(getAuthHeader(_)) // 调用工具类生成带Token的请求头 ) }
步骤4:主Simulation文件(整合所有模块)
新建MainSimulation.scala,组合各个业务场景:
import io.gatling.core.Predef._ import io.gatling.http.Predef._ import LoginScenario._ import ProfileScenario._ class MainSimulation extends Simulation { val httpConf = http .baseUrl("https://your-api-host.com") .acceptHeader("application/json") val userJourney = scenario("完整用户流程") .exec(login) .pause(3) .exec(getProfile) setUp( userJourney.inject(atOnceUsers(10)) ).protocols(httpConf) }
关键说明
- Session隔离性:每个虚拟用户的Session独立,不会出现Token串用问题,和Locust中每个
HttpUser实例独立存储的逻辑一致。 - 工具类复用:
TokenUtils是全局单例,所有模块可直接引入调用,统一Token存取逻辑,避免重复代码。 - 空值安全:用
Option[String]处理Token不存在的情况,避免空指针异常,可根据业务需求调整为空处理逻辑。
内容的提问来源于stack exchange,提问作者Post Malone
相关产品推荐
相关产品推荐

