如何在加特林负载测试中为多个虚拟用户使用单个 OAuth2.0 令牌

AmF*_*Mor 5 scala load-testing jsonpath gatling

我需要通过 Gattle 加载测试需要 OAuth2.0 令牌的 API(我是个新手!),但希望每个虚拟用户使用相同的令牌。我正在检索令牌(我认为)并将其放入名为“access”的变量中,但当测试本身开始时,我不断收到“没有定义名为“access”的属性”。

我的令牌检索如下所示(以及下面使用的 httpConf):

 class MySimulation extends Simulation {

 val httpConf = http        
    .baseUrl("https://MyBaseUrl.Com/")
    .acceptHeader("application/json") 
    .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

 val header = Map("Content-Type" -> """application/x-www-form-urlencoded""")

 al auth = scenario("Retrieve Token")
 .exec(http("POST OAuth Req")
 .post("https://SomeTokenUrl")
 .formParam("resource", "someresource")
 .formParam("grant_type", "somegranttype")
 .formParam("client_secret", "someclientsecret")
 .formParam("client_id", "someclientid")
 .headers(header).check(status.is(200)).check(jsonPath("$.access_token").find.saveAs("access"))) 
Run Code Online (Sandbox Code Playgroud)

然后我尝试将负载测试设置为(注意:我最初放置了“Map”,而不是可变变体,但在某处读到默认值是不可变的,并想知道这是否是标头无法更新的原因):

 val headers_10 = scala.collection.mutable.Map("Content-Type" -> "application/json; charset=ISO-8859-1", "Authorization" -> "Bearer ${access}")

 val scn = scenario("MyService Gatling test run")       
           .exec(http("")               
           .post("Myservice/api")
           .headers(headers_10.toMap)                
           .body(StringBody("""{"SomeProperty": "Some Value"}"""))
           .asJson
           .check(status.is(200)))

 setUp(
    auth.inject(constantUsersPerSec(1) during (2 seconds)),
    scn.inject(nothingFor(2 seconds),
    constantUsersPerSec(10) during (10 seconds) 
    ).protocols(httpConf))
    .assertions(global.responseTime.max.lt(500)) 
    .assertions(forAll.failedRequests.percent.lte(1)) 
    .assertions(global.responseTime.mean.lte(100)) 
Run Code Online (Sandbox Code Playgroud)

这个想法是,令牌检索将在负载测试启动之前完成,然后负载测试场景将使用“access”变量,但它给出以下结果:

  ERROR : Failed to build request: No attribute named 'access' is defined 
Run Code Online (Sandbox Code Playgroud)

我已经到了穷途末路的地步了。我猜这可能与范围有关,也许该变量不会延续到负载测试场景,但我在其他地方看到的示例似乎完全推荐了该设置,所以我不知道这些其他示例是否部分完整或什么。

Jam*_*arr 3

会话是每个用户的,并且用户之间不共享会话数据。因此,虽然您有 1 个用户运行“auth”场景并保存令牌,但运行“scn”的是两个不同的用户,并且他们无权访问 auth 用户的会话值。

这不是推荐的做法,但您可以通过将身份验证令牌推送到常规 scala var 中并在身份验证场景中进行设置并在主场景中读取它来解决此问题 - 您只需要确保身份验证始终在注入任何内容之前完成即可其他用户。

var token: String = ""
Run Code Online (Sandbox Code Playgroud)

然后在身份验证场景中,最后有一个步骤,例如

.exec(session => {
    token = session("access").as[String]
    session
})
Run Code Online (Sandbox Code Playgroud)

然后在 scn 场景开始时有一个设置会话变量的步骤

.exec(session.set("access", token))
Run Code Online (Sandbox Code Playgroud)

我过去使用过这种模式并且它有效,但我确信有更好的方法来做到这一点