2015-02-03 3 views
0

Gatling - отличный инструмент для тестирования нагрузки, но DSL как-то меня озадачивает. Проблема в том, что у меня уже есть пользовательские классы запросов и моделей, и я хочу создать своего рода «мост» для переноса существующих классов в DSL.Gatling 2 как измерить DSL

Вот пример:

exec { 
    val request = new GetIdRequest() 
    request.setCountry("US") 
    request // There is an implicit conversion 
    .check(status.is(200), bodyString.saveAs("ids")) 
}.exec { 
    session => 
    val ids = new ObjectMapper().readValue(session("ids").as[String], classOf[IdList]) 
    val request = new GetObjectRequest() 
    val request.setId(id(0)) 
    request // There is an implicit conversion 
     .check(status.is(200), bodyString.saveAs("object")) 
    session 
} 

где неявное преобразование просто преобразует request к http(...).get(url)...

Это, очевидно, не работает,

  1. сессия неизменен, поэтому " объект "не сохраняется в сеансе
  2. request в с econd exec не выполняется, потому что она не прошла в exec непосредственно

Так как я могу достичь желаемого эффекта? Есть ли пример, который я могу принять, или мне нужно реализовать свой собственный ActionBuilder (я не хочу этого делать, поскольку это будет похоже на запись другого протокола)? Благодаря

Update 1

Это решение, которое я придумал.

Я создал этот метод

def createHttp(name: String, req: Session => HttpRequest): HttpRequestBuilder = { 
    http(name) 
    .get { 
    session => req(session).getUri 
    } 
    .header("Content-Type", "application/json") 
    .header("Authorization", { 
    session => 
     val r = req(session) 
     Authorization.create("GET", r.getUri, appId, appKey) 
    }) 
} 

переводчика Тогда мне просто нужно передать в функции, которая создает HttpRequest

ответ

0

То, что вы не понимаете, что Гатлинг компонента DSL являются неизменными строителями, которые разрешены и прикованный один раз и только один раз, когда загружается симуляция.

Таким образом, вы можете:

  • ни строить запросы внутри сессии функций
  • ни вручную передать некоторые данные, которые были решены с сессии

Все, происходят во время выполнения, т.е. позже.

Ваш первый exec работает (хотя я бы посоветовал не изменять дизайн), потому что содержимое блока статично, запрос действительно построен один раз.

Ваш второй exec фактически создает новый конструктор запросов каждый раз, когда он выполняется, но он просто отбрасывается.

Если вы действительно хотите написать свой собственный DSL, вам нужно принять участие в работе Gatling. Вы не можете использовать его только для принятия разрешенных значений, например, вашего setId, вы также можете взять Expression.

Также обратите внимание, что ваш способ сохранения всего тела ответа и создания нового ObjectMapper для каждого исполнения является громоздким и неэффективным.

Вы можете просто использовать JsonPath чек, чтобы захватить один интересующий вас идентификатор, а затем используйте Gatling EL для ввода сохраненного значения в следующий запрос.

+0

Благодарим вас за ответ. Я нашел способ устранить пробел, передав параметры типа 'Session => MyRequest' методу транслятора, который переводит это в выражение. Это работает очень хорошо. – stackoverflower

Смежные вопросы