如何在加特林模拟期间为所有虚拟用户设置一个全局变量?

How to set a global variable for all virtual users during gatling simulation?

在我的模拟中,用户只是循环发送请求。每个请求都包含一个自定义 header 并且它的值是从一个变量中读取的。 但是,我想在模拟期间更改变量的值,以便所有虚拟用户(包括活动用户)从此时开始在自定义 header 中发送新值。

这是我尝试过但没有成功的方法:

class MySimulation extends Simulation {
  
  var GLOBAL_LIMIT = "49"

  def myRequest: HttpRequestBuilder =
    http("My request")
      .get("/")
      .header("LIMIT", GLOBAL_LIMIT)
      .check(status.is(200))

  def myScenario: ScenarioBuilder =
    scenario("Poll")
      .forever(
        pace(1.second)
          .exec(myRequest)
      )

  def changeLimit(limit: String): ScenarioBuilder =
    scenario("Change limit")
      .exec(session => {
        GLOBAL_LIMIT = limit
        session
      })

  setUp(
    myScenario.inject(
      constantUsersPerSec(1) during 30.seconds
    ),
    changeLimit("59").inject(
      nothingFor(10.seconds),
      atOnceUsers(1)
    )
  ).protocols(http.baseUrl("http://localhost:8081"))
}

我也试过用 scala.util.Properties.setProp() 存储值,然后用 scala.util.Properties.propOrElse() 读取它,但这也不起作用。所有请求都将自定义 header 设置为初始值 "49"

有没有办法设置(然后更改)用于模拟的全局变量,类似于 session 但对所有虚拟用户通用?

那是因为当你写 .header("LIMIT", GLOBAL_LIMIT) 时,你传递了一个 作为 header 方法的第二个参数,并且这个值被评估一旦加载模拟。此时,GLOBAL_LIMIT 仍然为空,因为它只会在稍后模拟为 运行.

时填充

相反,您必须传递一个 函数,每次虚拟用户尝试生成此请求时都会对其进行评估

.header("LIMIT", session => GLOBAL_LIMIT)