Как создать базовую логику пагинации в Gatling? - PullRequest
1 голос
/ 07 октября 2019

Итак, я пытаюсь создать базовую нумерацию страниц в Гатлинге, но безуспешно.

Мой текущий сценарий выглядит следующим образом:

1) Первый вызов всегда является запросом POST, тело содержит индекс страницы 1 и размер страницы 50

 {"pageIndex":1,"pageSize":50}

Язатем получим 50 объектов + общее количество объектов в среде:

"totalCount":232

Поскольку мне нужно перебрать все объекты в среде, мне нужно будет POST этот вызов 5 раз, каждый раз с обновленнымpageIndex.

Мой текущий (ошибочный) код выглядит следующим образом:

  def getAndPaginate(jsonBody: String) = {
    val pageSize = 50;
    var totalCount: Int = 0
    var currentPage: Int = 1
    var totalPages: Int =0
    exec(session => session.set("pageIndex", currentPage))
    exec(http("Get page")
      .post("/api")
      .body(ElFileBody("json/" + jsonBody)).asJson
          .check(jsonPath("$.result.objects[?(@.type == 'type')].id").findAll.saveAs("list")))
      .check(jsonPath("$.result.totalCount").saveAs("totalCount"))
      .exec(session => {
        totalCount = session("totalCount").as[Int]
        totalPages =  Math.ceil(totalCount/pageSize).toInt
        session})
      .asLongAs(currentPage <= totalPages)
      {
        exec(http("Get assets action list")
          .post("/api")
          .body(ElFileBody("json/" + jsonBody)).asJson
          .check(jsonPath("$.result.objects[?(@.type == 'type')].id").findAll.saveAs("list")))
        currentPage = currentPage+1
        exec(session => session.set("pageIndex", currentPage))
        pause(Config.minDelayValue seconds, Config.maxDelayValue seconds)

      }
  }

В настоящее время значения нумерации страниц не присваиваются переменным, которые я создал в начале функции, если я создаю переменныена уровне объекта они назначаются, но таким образом, который я не понимаю. Например, результат Math.ceil (totalCount / pageSize) .toInt равен 4, тогда как должен быть 5. (Это 5, если я выполню его в ближайшем окне .... Я не получаю его). Я бы ожидал, что asLongAs (currentPage <= totalPages) будет повторяться 5 раз, но повторяется только дважды. </p>

Я пытался создать функцию в классе, а не в Object, потому что, насколько я понимаю, существует только один Object. (Чтобы запретить нескольким пользователям доступ к одной и той же переменной, я также запускал только одного пользователя с одинаковым результатом) Я, очевидно, здесь упускаю что-то базовое (новичок в Gatling и Scala), поэтому любая помощь будет высоко оценена :)

1 Ответ

2 голосов
/ 08 октября 2019

использование обычных переменных scala для хранения значений не сработает - gatling DSL определяет компоновщики, которые выполняются только один раз при запуске, поэтому строки типа

.asLongAs(currentPage <= totalPages)

будут выполняться только с начальнымзначения.

Так что вам просто нужно обрабатывать все, используя переменные сеанса

def getAndPaginate(jsonBody: String) = {
  val pageSize = 50;

  exec(session => session.set("notDone", true))
  .asLongAs("${notDone}", "index") {
    exec(http("Get assets action list")
      .post("/api")
      .body(ElFileBody("json/" + jsonBody)).asJson
      .check(
        jsonPath("$.result.totalCount")
          //transform lets us take the result of a check (and an optional session) and modify it before storing - so we can use it to get store a boolean that reflects whether we're on the last page
          .transform( (totalCount, session) => ((session("index").as[Int] + 1) * pageSize) < totalCount.toInt)
          .saveAs("notDone")
      )
    )
    .pause(Config.minDelayValue seconds, Config.maxDelayValue seconds)
  }
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...