You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:57:21