Как не пройти тест Гатлинга из exec?

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

Это кажется наиболее простым из возможных сценариев, но я не могу найти достоверной информации о том, как провалить тест из блока exec. assert нарушает сценарий и, казалось бы, Гатлинга (например, выброс исключения не просто не проходит тест).

Пример:

// The scenario consists of a single test with two exec creating the execChain
val scn = scenario("MyAwesomeScenario").exec(reportableTest(

     // Send the request
     exec(http("127.0.0.1/Request").get(requestUrl).check(status.is(200)).check(bodyString.saveAs("MyData")

     // Process the data
    .exec(session => { 
         assert(processData(session.attributes("MyData")) == true, "Invalid data");
    })
))

Выше сценария где-то в строке «Страж отказал, выключение системы».

Теперь это кажется полезным и часто используемым занятием - возможно, мне не хватает чего-то простого. Как это сделать?


person hauron    schedule 02.09.2014    source источник


Ответы (4)


Вы должны соблюдать API Gatling.

  1. С проверками вы «проваливаете» не тест, а запрос. Если вы хотите, чтобы весь тест не прошел, вам следует взглянуть на API утверждений и плагин Jenkins .
  2. Вы можете выполнить Проверку только на сайте запроса, а не позже. Одна из очень веских причин заключается в том, что если вы сохраните bodyString в сеансах, как вы это делаете, вы закончите использовать много памяти и, возможно, выйдет из строя (все еще упоминается, поэтому не подлежит сборке мусора). Вы должны выполнить свой processData в проверке, обычно в преобразовать необязательный шаг.
person Stephane Landelle    schedule 02.09.2014
comment
Спасибо за ответ. Я изучу API утверждений. О проверке: проверка afaik нарушит цепочку выполнения, остановив дальнейшую очистку / журнал данных от начала, и я хотел бы избежать ее потери (я читал некоторые из ваших разговоров о реализации медленного сбоя). Также в этом конкретном тесте память не имеет значения: мы используем Gatling как для функционального да / нет, так и для тестирования производительности. - person hauron; 02.09.2014
comment
Нет, по умолчанию проверка не прерывает цепочку выполнения. Только если вы заключите внутри блока exitBlockOnFail: gatling.io/docs/2.0.0-RC3/general/ - person Stephane Landelle; 02.09.2014
comment
Извините, я подумал, что у меня установлена ​​более старая версия Gatling. На самом деле утверждения кажутся идеальными. Могу я спросить, можно ли утверждать данные сеанса с уровня scn (...). Assertions (...)? - person hauron; 02.09.2014
comment
Нет, статистика поддержки вычисляется только глобально, поэтому утверждения доступны только на уровне setUp atm. Мы планируем рефакторинг механизма утверждений в 2.1, чтобы вы могли открыть запрос функции. - person Stephane Landelle; 02.09.2014
comment
Еще раз спасибо, я постараюсь это сделать. - person hauron; 02.09.2014
comment
Поскольку это было (казалось бы) невозможным, я вернулся к ошибке, вызванной проверкой запроса (как было предложено). Примечательно - это сильно упростило процесс (хотя и снизило гибкость кода). - person hauron; 02.09.2014

вы искали что-то вроде

  .exec(http("getRequest")
    .get("/request/123")
    .headers(headers)
    .check(status.is(200))
    .check(jsonPath("$.request_id").is("123")))
person agrwal    schedule 30.05.2017

Поскольку очередь редактирования уже заполнена.

Это уже решено в новой версии Gatling. Релиз 3.4.0

Они добавили

exitHereIf

exitHereIf("${myBoolean}")
exitHereIf(session => true)

Заставьте пользователя выйти из сценария с этого момента, если условие выполняется. Параметр условия - это выражение [логическое].

person Andrew James Ramirez    schedule 27.01.2021

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

Таким образом используется exitHereIfFailed

val scn = scenario("MyAwesomeScenario")
.exec(http("Get data from endpoint 1")
  .get(request1Url)
  .check(status.is(200))
  .check(bodyString.saveAs("MyData"))
  .check(processData(session.attributes("MyData")).is(true)))
.exitHereIfFailed // If we weren't able to get the data, don't continue
.exec(http("Send the data to endpoint 2")
  .post(request2Url)
  .body(StringBody("${MyData}"))

Этот сценарий будет корректно прерван на exitHereIfFailed, если какая-либо из проверок до exitHereIfFailed не удалась.

person suo    schedule 29.10.2019