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)
我已经到了穷途末路的地步了。我猜这可能与范围有关,也许该变量不会延续到负载测试场景,但我在其他地方看到的示例似乎完全推荐了该设置,所以我不知道这些其他示例是否部分完整或什么。
会话是每个用户的,并且用户之间不共享会话数据。因此,虽然您有 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)
我过去使用过这种模式并且它有效,但我确信有更好的方法来做到这一点
| 归档时间: |
|
| 查看次数: |
5593 次 |
| 最近记录: |