Это не сработает, потому что Гатлинг работает не так, как вы (и, в основном, все, кто начинает его использовать) думают.Построитель цепочки сценариев выполняется только один раз за симуляцию и создает цепочку действий, которая затем используется каждым отдельным пользователем в качестве шаблона для всех запросов.Поэтому вам нужно не создать ChainBuilder
в сеансе, а извлечь данные из сеанса в ChainBuilder.В вашем случае будет проще использовать Session.Expression[T]
(некоторые действия принимают этот тип параметра, который является функцией типа Session => T
, чтобы ваш код мог выглядеть так:
val testTCSService = scenario("Some Scenario")
.doIf(session => session.contains("value")) {
exec(session => if(session.contains("otherValue")) session else session.markAsFailed)
.exitHereIfFailed
.exec(verifyHTTPCall)
}
def generateHeader(a: String, b: String, c: String): String = ???
def verifyHTTPCall = http("HTTP Call")
.post("Some URL")
.header("header_value", session => generateHeader(session("value").as[String], session("secondValue").as[String], session("thirdValue").as[String]))
.check(status.is(200))
Или проще с передачейвесь сеанс вместо 3-х значений атрибутов и избавление от избыточного doIf
(который пропускает весь сценарий, если значение не установлено, поэтому весь механизм неудачного сеанса не будет работать):
def generateHeader(session: Session): String = {
//Extract values from session and build header
}
val testTCSService = scenario("Some Scenario")
.exec(session => if(session.contains("otherValue")) session else session.markAsFailed)
.exitHereIfFailed
.exec(http("HTTP Call")
.post("Some URL")
.header("header_value", session => generateHeader(session))
.check(status.is(200)))