将属性添加到 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"))
)
}
我想使用不同的登录方法(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"))
)
}