使用 Gatling 通过变量传递 Bearer 令牌
Passing Bearer token through variable using Gatling
我正在学习 Gatling 工具并坚持开发安全 Http API 调用的场景。我创建了一个场景,在该场景中我能够获取不记名令牌并将其保存在变量(令牌)中,但变量(令牌)未在授权中传递其值 header.
这是我的代码,请检查一下,
令牌变量的值未通过以下代码行获取,
.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))
}
您的令牌未被使用,因为您将其传输到标准 Scala 变量,而不是仅通过 session.
Gatling 生成器在启动时执行一次,因此当您的 httpConf
引用 $token
时,它会在发出任何请求之前一次从该 var 获取值 - 因此 token
将是 ""
.
由于您似乎希望一次调用获得一个令牌,然后在第二种情况下供所有用户使用,因此您需要将 token
var 中的值加载到 session 中,并且更新你 header httpConf
以使用 Gatling EL(它将从 session 中提取值)
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)
}
从下面得到我的答案link:
为了在session中获取token,需要在场景中传递token方法
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())
我正在学习 Gatling 工具并坚持开发安全 Http API 调用的场景。我创建了一个场景,在该场景中我能够获取不记名令牌并将其保存在变量(令牌)中,但变量(令牌)未在授权中传递其值 header.
这是我的代码,请检查一下,
令牌变量的值未通过以下代码行获取, .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))
}
您的令牌未被使用,因为您将其传输到标准 Scala 变量,而不是仅通过 session.
Gatling 生成器在启动时执行一次,因此当您的 httpConf
引用 $token
时,它会在发出任何请求之前一次从该 var 获取值 - 因此 token
将是 ""
.
由于您似乎希望一次调用获得一个令牌,然后在第二种情况下供所有用户使用,因此您需要将 token
var 中的值加载到 session 中,并且更新你 header httpConf
以使用 Gatling EL(它将从 session 中提取值)
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)
}
从下面得到我的答案link:
为了在session中获取token,需要在场景中传递token方法
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())