Gatling: динамически настраивать один сценарий несколько раз

У меня есть один сценарий с 4 разными вызовами API, которые всегда остаются неизменными. Я пытаюсь создать параллельный стресс-тест, где я хочу, чтобы тот же сценарий запускался сначала, скажем, с 10%, а затем с 20%, 30% ... и так далее от максимального количества пользователей.

Я столкнулся с проблемой, когда я не могу настроить один и тот же сценарий более одного раза.

Но мне также нужно, чтобы настройка была динамической, в зависимости от настраиваемых переменных в скрипте. Это то, что вызывает проблему, я хочу иметь возможность легко настроить его для запуска, например. 10%, 50% и 100%.

Это то, что у меня есть до сих пор (сокращено, и atOnceUser и nothingFor динамически принимают входные данные из конфигурации, повторяющейся по бла (я))

def scnList() = {
    var scnList = new ArraySeq[PopulationBuilder](someArray.length)
    var i = 0
    for (i <- 0 until someArray.length) {
      var scen = myscenario
        .inject(atOnceUsers((bla(i)), nothingFor(blabla(i) minutes))
      scnList(i) = scen
    }
    scnList
}

setUp(scnList: _*).protocols(httpConf)
    .assertions(global.successfulRequests.percent.gt(99),
    forAll.responseTime.max.lt(5000)
)
1
0
2 927
1

Ответы 1

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

val steps = Seq(5, 10, 15, 25, 40) // Contains users/s in each step, can be read from config

//Build list of injections based on sequence above
val injectionProfile = steps.flatMap(
  load => Seq(
    constantUsersPerSec(load).during(30 seconds),
    nothingFor(10 seconds)
  )
)

val httpConf = http.baseURL("http://google.com")

val myscenario = scenario("My scenario")
  .exec(
    http("Get example")
      .get("/")
      .check(status.is(200))
  )

setUp(
  myscenario.inject(injectionProfile).protocols(httpConf)
)

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

Другие вопросы по теме