如何在加特林中为每个用户(线程运行)设置不同的协议

How to set different protocol for each user (threads running) in gatling

我正在尝试创建一个性能测试套件,其中我有一组将随机选择的 ID。对于每个 ID,都有一个指定的 auth_token 赋值。

在协议中,如果我传递随机 ID 将采用的方法,它始终将其设置为整个操作的特定 ID。

我期待这样的事情,我正在定义 10 个虚拟用户,并且对于每个用户,协议应该更改 ID 并继续场景执行。

目前Gatling在最先设置协议,10个用户都使用同一个协议


        id = random.generate //generate random id
   authHeader = Method(id);

    def method (id:String) : String{
       if(id=="id1")
        return token1
       else if(id=="id2")
         return token2
       ""
}

    val httpProtocol = http.baseUrl(baseURI)
      .acceptHeader(header)
      .authorizationHeader(authHeader)
      .contentTypeHeader(contentType)
      .userAgentHeader(agentHeader)

val scn1: ScenarioBuilder = scenario("name")
        .exec(http("scenario1")
        .post(device_context) 
        .body(payload)
        .check(status.is(202)))

setUp(scn1.inject(atOnceUsers(2)).protocols(httpProtocol))```

In the above code i need the suite to run for 2 different id.

要完成这项工作,您将不得不使用 session 变量来保存您的 authHeader。 DSL 方法定义了只执行一次的构建器——这解释了你所看到的。

最好的方法是构建一个馈线来保存您的 ID 和身份验证令牌(我假设您没有在其他任何地方使用该 ID)

因此定义一个将密钥(只是一个字符串)映射到包含 id 和 auth 令牌的映射的馈线

//a list of strings to hold the auth tokens
private val ids = List(Map("id" -> "id1", "auth" -> "token1"), Map("id" -> "id2", "auth" -> "token2"), ...)

//the feeder to put a random token into the session
private val idFeeder = Iterator.continually(Map("id" -> Random.shuffle(ids).head))

现在,当您在 idFeeder 上调用 .feed 时,您会得到一个随机映射,该映射在 session 变量 "id"[=12= 中具有 "id" 和 "auth" 的键]

因此请更新您的场景以使用馈线并设置授权 header(并从您的协议定义中删除 .authorizationHeader)

val scn1: ScenarioBuilder = scenario("name")
    .feed(idFeeder)
    .exec(http("scenario1")
    .header("Authorization", "${id.auth})"
    .post(device_context) 
    .body(payload)
    .check(status.is(202)))

在您的 body 中,您可以使用“${id.id}”

访问用户 ID 字符串

或者您可以更新您的协议定义以具有 ${id} 引用,但我发现在与调用 .feed

的同一块中使用馈线值更好