【问题标题】:How to share a former retrieved value between concurrent requests?如何在并发请求之间共享以前检索到的值?
【发布时间】:2014-06-11 11:54:33
【问题描述】:

我目前正在使用gatling 测试网络服务。 因此,我必须通过对 Web 服务的请求来检索一些 accessToken

val accessToken = exec(http("access token")
  .get("""/protected/document/access.do?id=266892""")
  .headers(headers_html)
  .check(status.lessThan(400))
  .check(regex("""\"accessToken\":\"(.+?)\"""").saveAs("accessToken"))
).pause(50 milliseconds)

之后,我使用检索到的accessToken 向 Web 服务发出一些请求。 到目前为止,这有效。

但现在我想使用检索到的accessToken 同时对后面的请求进行压力测试。 accessToken 只能被检索一次,但之后的并发请求都应该使用相同的检索到的accessToken

我对 scala 不太熟悉,但我制作了一个 scala 单例,我想将检索到的 accessToken 存储在一个单例变量中,以便以后并发请求可以使用。

这是一个好方法吗?我怎样才能做到这一点?

【问题讨论】:

  • accessToken 会被严格检索一次吗?然后在应用程序的整个生命周期中使用?
  • Futures/Promises 或 Actors 都可以解决问题...
  • @VikasPandya 是的,在整个 gatling 运行时严格执行一次。请求另一个访问令牌(挑剔:针对同一资源)会使服务器端的前一个访问令牌无效。

标签: scala stress-testing gatling


【解决方案1】:

您要检索多少个 accessToken?每个虚拟用户只能共享一个或一个?

如果是前者,则不能使用 Gatling API 来获取它。 Gatling 提供 AsyncHttpClient,因此您可以使用它来获取 accessToken 并将其作为 val 存储在 Simulation 中。

如果是后者,只需使用 Gatling EL 将保存的值注入其他请求:“foo${accessToken}bar”。

顺便说一句,我怀疑您的正则表达式是否按预期工作。您使用了三引号转义,因此您应该保护您的内部双引号:""""accessToken":"(.+?)""""

【讨论】:

  • 我需要为所有虚拟用户共享一个。我目前使用的第二种方法与ELFileBody 结合使用,其中${accessToken} 表达式正在被替换。但这不适用于会话/虚拟用户。正则表达式必须为匹配文字 " 的正则表达式解析器转义引号。转义是针对正则表达式解析器而不是针对 scala。尝试匹配"accessToken":"blablub"
  • 所以就像我说的,你必须手动获取 accessToken。甚至 URLConnection 也能胜任。如果您在模拟主体中执行此操作,它将在运行模拟之前执行。
  • 我会在下周的星期一在我的生日和“漫长的免费周末”之后试试这个。听起来这可能会有所帮助。 ;)
  • 我必须坚持我所说的关于双引号转义的内容。这通常是 Scala 编译器所要求的,除非您像以前那样使用三重双引号。见gist.github.com/slandelle/159f10f5c29f25cebe31
  • 嗯,这很有趣。真实世界的字符串响应看起来像这样body= {"accessToken":"2326e36f-d3f9-497d-ab25-75873d275fe5","webserviceUri":"https:\/\/deer.example.com:443\/services\/document","success":true,"idDocument":266892}。在body= 之后有一个换行符。您的字符串没有找到访问令牌,而是我的。这是怎么来的? gatling regex() 和你发的那个有区别吗?
猜你喜欢
  • 2021-06-27
  • 1970-01-01
  • 2020-01-09
  • 2013-12-10
  • 1970-01-01
  • 2015-11-03
  • 2016-01-05
  • 1970-01-01
  • 2022-06-26
相关资源
最近更新 更多