将属性添加到 session

adding attribute to session

我想使用不同的登录方法(Bearer 或 JWT)进行登录。所以我创建了这个 object 以在模拟中重用:

object Login {
  private val login: String = ConfigObject.config("login").asInstanceOf[String]
  private val password: String = ConfigObject.config("password").asInstanceOf[String]
  private val useBearer: Boolean = ConfigObject.config("useBearer").asInstanceOf[Boolean]
  private val bearerToken: String = ConfigObject.config("authToken").asInstanceOf[String]

  var loginAction: ChainBuilder = _

  loginAction = exec { session =>
    if (useBearer) {
      val bearerTokenString = s"Bearer $bearerToken"
      session.set("token", bearerTokenString)
    } else {
      http("Login user")
        .post("/auth/token/obtain")
        .body(StringBody(s"""{ "email": "$login", "password":"$password" }""")).asJson
        .headers(Map("Content-Type" -> "application/json"))
        .check(jsonPath("$.token").saveAs("jwtToken"))
      val jwtToken = session("jwtToken").as[String]
      session.set("token", s"JWT $jwtToken")
    }
    session
  }
}

但是当我尝试像这样构建 headers 时,我得到 构建请求失败:未定义名为 'token' 的属性

val headers: Map[String, String] = Map(
      "Content-Type" -> "application/json",
      "Authorization" -> "${token}")

我对 scala 和 gatling 不是很熟悉所以请指导我如何正确地做到这一点

您的示例不起作用有几个原因。

设置 'token' 不起作用的原因是会话是不可变的 - session.set return 是一个新会话,但您 return 是初始会话在 'loginAction'

的最后一行

你的 jwt 流程也不行。 gatling dsl 定义了在启动时创建的构建器——这些构建器用于生成用户在注入后将遵循的所有步骤。您不能在模拟期间通过会话函数创建额外的指令——这就是您在这里尝试做的。所以你的 'else' 块中的所有内容都不会被执行。

您可以在加特林操作中处理所有内容,或者将 loginAgction 更改为 return ChainBuilder 而不是像这样的会话函数...

def loginAction: ChainBuilder =
  if (useBearer) {
    exec(session => session.set("token", s"Bearer $bearerToken")) //returns a new session
  } else {
    exec(http("Login user")
      .post("/auth/token/obtain")
      .body(StringBody(s"""{ "email": "$login", "password":"$password" }""")).asJson
      .headers(Map("Content-Type" -> "application/json"))
      .check(jsonPath("$.token").transform(token => s"JWT $token").saveAs("token"))
    )
  }