Как установить разные протоколы для каждого пользователя (потоки работают) в gatling - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь создать набор тестов производительности, в котором у меня есть массив идентификаторов, которые будут выбраны случайным образом. Для каждого идентификатора есть назначенный идентификатор auth_token.

В протоколе, если я передаю метод, в котором будут использоваться случайные идентификаторы, он всегда устанавливает этот конкретный идентификатор для всей операции.

Я ожидаю что-то вроде, я определяю10 виртуальных пользователей и для каждого пользователя протокол должен изменить идентификатор и продолжить выполнение сценария.

В настоящее время Гатлинг устанавливает протокол первым и использует один и тот же протокол для всех 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.

1 Ответ

0 голосов
/ 08 ноября 2019

Чтобы это работало, вам нужно будет использовать переменную сеанса для хранения вашего authHeader. Методы DSL определяют компоновщики, которые выполняются только один раз - что объясняет то, что вы видите.

Лучший способ сделать это - создать фидер для хранения ваших идентификаторов и токенов аутентификации (я полагаю, вывы больше нигде не используете идентификатор)

Итак, определите фидер, который отображает ключ (просто строку) на карту, содержащую идентификатор и токен авторизации

//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))

, теперь, когда вывызов .feed на idFeeder вы получаете случайную карту, которая имеет ключи для «id» и «auth» в переменной сеанса «id»

, поэтому обновите ваш сценарий, чтобы использовать фидер и установить заголовок авторизации (и удалить.authorizationHeader из определения вашего протокола)

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

в вашем теле вы можете получить доступ к строке идентификатора пользователя с помощью "$ {id.id}"

или вы можете обновить определение протокола, чтобыссылка $ {id}, но я считаю, что лучше использовать значение фидера в том же блоке, что и при вызове .feed

...