[英]Passing Bearer token through variable using Gatling
I am learning the Gatling tool and stuck in developing scenarios for Secure Http API calls.我正在学习 Gatling 工具并坚持开发安全 Http API 调用的场景。 I have created a scenario in which I am able to get the bearer token and save it in the variable(Token), but the variable(Token) is not passing its value in the authorization header.
我创建了一个场景,在该场景中我能够获取不记名令牌并将其保存在变量(令牌)中,但变量(令牌)未在授权 header 中传递其值。
Here's my code pleaser review it,这是我的代码请检查它,
The value of the token variable is not getting by the following code line, .authorizationHeader(s"Bearer $token")令牌变量的值未通过以下代码行获取,.authorizationHeader(s"Bearer $token")
====================================================== ================================================ ====
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
import scala.collection.JavaConversions._
class SampleToken2 extends Simulation {
//Token define
private var token: String = ""
val auth = scenario("Retrieve Token")
.exec(
http("POST Auth Req")
.post("http://iserver:9092/login")
.body(ElFileBody("bodies/inventalogin.json")).asJson
.check(bodyString.saveAs("Auth_Response"))
.check(status.is(200))
.check(jsonPath("$.token").find.saveAs("accesskey")))
.exec{session => { token = session("accesskey").as[String]
session}}
//Header Define
val httpConf = http
.baseUrl("http://iaserver:9092")
.authorizationHeader(s"Bearer $token")
.acceptHeader("application/json, */*")
.acceptCharsetHeader("UTF-8") // Here are the common headers
.doNotTrackHeader("1")
.acceptLanguageHeader("en-UK,en;q=0.5")
.acceptEncodingHeader("gzip, deflate")
.userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0")
.shareConnections
.proxy(Proxy("localhost", 8888).httpsPort(8888))
def myTestObjectMethod = {
exec { session => println("token print2"); session }
exec { session => println(token:String); session }
exec(http("Get all devices with pagination")
.get("/devices/getAllDevices?page=0&size=200")
.check(status.in(200 to 210)))
.pause(1, 20)
}
val scn = scenario("my_actual_load_test").exec(myTestObjectMethod)
setUp(
auth.inject(constantUsersPerSec(1) during (1 seconds)),
scn.inject(nothingFor(2 seconds),
constantUsersPerSec(50) during (300 seconds)
)
.protocols(httpConf))
.assertions(global.responseTime.max.lt(500))
.assertions(forAll.failedRequests.percent.lte(1))
.assertions(global.responseTime.mean.lte(100))
}
Your token is not getting used because you're transferring it to a standard scala variable rather than just passing it through the session.你的令牌没有被使用,因为你将它转移到标准的 scala 变量,而不是仅仅通过 session 传递它。
Gatling builders are executed once at startup, so when your httpConf
references $token
it's getting the value from that var at a time before any requests have been made - hence the value of token
will be ""
. Gatling 构建器在启动时执行一次,因此当您的
httpConf
引用$token
时,它会在发出任何请求之前一次从该 var 获取值 - 因此token
的值将为""
。
Since you seem to want one call to get a token that is then used by all users in the second scenario, you need to load the value in the token
var into the session and update you header httpConf
to use the Gatling EL (which will pull the value from the session)由于您似乎希望通过一次调用获得一个令牌,然后在第二种情况下供所有用户使用,因此您需要将
token
var 中的值加载到 session 并更新您 header httpConf
以使用 Gatling EL(这将拉来自会话的值)
val httpConf = http
.baseUrl("http://iaserver:9092")
.authorizationHeader("Bearer ${token}")
.acceptHeader("application/json, */*")
...
def myTestObjectMethod = {
exec(session => session.set("token", token)
.exec(http("Get all devices with pagination")
.get("/devices/getAllDevices?page=0&size=200")
.check(status.in(200 to 210))
)
.pause(1, 20)
}
Got my answer from the below link: Gatling Scala:Unable to send auth token to the method using session variable从以下链接得到我的答案: Gatling Scala:Unable to send auth token to the method using session variable
I need to pass the token method in the scenario in order to get the token in the session.我需要在场景中传递令牌方法才能在 session 中获取令牌。
val authAPI = exec(
exec(
http("POST Auth API")
.post("http://iserver:9092/login")
.body(ElFileBody("bodies/inventalogin.json")).asJson
.check(bodyString.saveAs("Auth_Response"))
.check(status.is(200))
.check(jsonPath("$.token").find.saveAs("token")))
exec{session => { tokenAPI = session("token").as[String]
session}}
var headers_10 = Map("Content-Type" -> """application/json""", "Authorization" -> "Bearer ${token}")
def getAllDevices() = {
exec { session => println("token print2"); session }
exec { session => println(tokenAPI:String); session }
exec(session => session.set("token", tokenAPI))
exec(http("Get all devices")
.get("/devices/getAllDevices")
.headers(headers_10)
.check(status.in(200 to 210)))
//.exec { session => println(session); session }
.pause(1, 20)
}
// Scenario Definition
val scn = scenario("Basic")
.exec(authAPI)
.pause(1)
.exec(getAllDevices())
.pause(1)
.exec(getAllDevicesPagination())
.pause(1)
.exec(logintest())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.