Gatling: получить ресурс REST, изменить лист JSON, отправить обратно

Я работаю над тестовым скриптом, тестирую интерфейс REST в Gatling с помощью Scala.

Для конкретного ресурса REST это то, чего я хотел бы достичь:

  1. Получите ресурс (который предоставит мне данные JSON в теле).
  2. Используйте jsonpath, чтобы изменить значение в теле.
  3. Отправьте измененное тело обратно на тот же URL

Мне удалось добиться успеха с 1 и 3. Единственная оставшаяся проблема - изменить данные json, которые кажутся в строковом формате.

Шаги теста

object WebTestCollection {


    def getAccountDetails() = http("Get account")
      .get("/account")
      .check(jsonPath("$.billingAccount").saveAs("accountjson"))


    def postNewAccountDetails() = http("Post modified account")
      .post("/account").asJSON
      .body("${accountjson}")

}

Часть сценария

val scn = scenario("Web Usage")
    .feed(testRuns)


        .exec(WebTestCollection.getAccountDetails())
        .exitHereIfFailed

        .exec(session => {
              var account = session.getAttribute("accountjson")
              account.notes = "Performance Test Comment"
              println(account)
              session.setAttribute("accountjson", account)
          }
        )       

        .exec(WebTestCollection.postNewAccountDetails())
        .exitHereIfFailed

Я получаю следующие ошибки

09:59:30.267 [ERROR] c.e.e.g.a.ZincCompiler$ - <snip>/WebScenario.scala:172: value notes is not a member of Any
09:59:30.268 [ERROR] c.e.e.g.a.ZincCompiler$ -            account.notes = "Performance Test Comment"
09:59:30.269 [ERROR] c.e.e.g.a.ZincCompiler$ -                                   ^
09:59:30.664 [ERROR] c.e.e.g.a.ZincCompiler$ - one error found
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at scala_maven_executions.MainHelper.runMain(MainHelper.java:164)
    at scala_maven_executions.MainWithArgsInFile.main(MainWithArgsInFile.java:26)
Caused by: Compilation failed
    at sbt.compiler.AnalyzingCompiler.call(AnalyzingCompiler.scala:76)
    at sbt.compiler.AnalyzingCompiler.compile(AnalyzingCompiler.scala:35)
    at sbt.compiler.AnalyzingCompiler.compile(AnalyzingCompiler.scala:29)
    at sbt.compiler.AggressiveCompile$$anonfun$4$$anonfun$compileScala$1$1.apply$mcV$sp(AggressiveCompile.scala:71)
    at sbt.compiler.AggressiveCompile$$anonfun$4$$anonfun$compileScala$1$1.apply(AggressiveCompile.scala:71)
    at sbt.compiler.AggressiveCompile$$anonfun$4$$anonfun$compileScala$1$1.apply(AggressiveCompile.scala:71)
    at sbt.compiler.AggressiveCompile.sbt$compiler$AggressiveCompile$$timed(AggressiveCompile.scala:101)
    at sbt.compiler.AggressiveCompile$$anonfun$4.compileScala$1(AggressiveCompile.scala:70)
    at sbt.compiler.AggressiveCompile$$anonfun$4.apply(AggressiveCompile.scala:88)
    at sbt.compiler.AggressiveCompile$$anonfun$4.apply(AggressiveCompile.scala:60)
    at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:24)
    at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:22)
    at sbt.inc.Incremental$.cycle(Incremental.scala:52)
    at sbt.inc.Incremental$.compile(Incremental.scala:29)
    at sbt.inc.IncrementalCompile$.apply(Compile.scala:20)
    at sbt.compiler.AggressiveCompile.compile2(AggressiveCompile.scala:96)
    at sbt.compiler.AggressiveCompile.compile1(AggressiveCompile.scala:44)
    at com.typesafe.zinc.Compiler.compile(Compiler.scala:158)
    at com.typesafe.zinc.Compiler.compile(Compiler.scala:142)
    at com.excilys.ebi.gatling.app.ZincCompiler$.apply(ZincCompiler.scala:104)
    at com.excilys.ebi.gatling.app.SimulationClassLoader$.fromSourcesDirectory(SimulationClassLoader.scala:34)
    at com.excilys.ebi.gatling.app.Gatling$$anonfun$12.apply(Gatling.scala:89)
    at com.excilys.ebi.gatling.app.Gatling$$anonfun$12.apply(Gatling.scala:89)
    at scala.Option.getOrElse(Option.scala:108)
    at com.excilys.ebi.gatling.app.Gatling.start(Gatling.scala:89)
    at com.excilys.ebi.gatling.app.Gatling$.fromMap(Gatling.scala:54)
    at com.excilys.ebi.gatling.app.Gatling$.runGatling(Gatling.scala:74)
    at com.excilys.ebi.gatling.app.Gatling$.main(Gatling.scala:49)
    at com.excilys.ebi.gatling.app.Gatling.main(Gatling.scala)
    ... 6 more

person www.jensolsson.se    schedule 29.07.2014    source источник


Ответы (1)


Только текущий снимок Gatling 2 позволяет вам сохранить результат JsonPath в другом месте чем String:

jsonPath(expression).ofType[T]

Но тогда у нас в настоящее время нет возможности редактировать, а затем повторно сериализовать JSON AST. Мы поставляем парсеры JSON (Boon и Jackson), так что вы, вероятно, сможете добиться этого самостоятельно. Вы также можете открыть запрос функции.

person Stephane Landelle    schedule 29.07.2014
comment
Спасибо за ответ. Я хотел бы увидеть пример того, как сериализовать / десериализовать с помощью boon или jackson - person www.jensolsson.se; 29.07.2014
comment
Честно говоря, вам лучше сохранить JSON AST, а затем создать тело шаблона, в котором вы извлекаете значения с помощью Gatling EL (с моментальным снимком Gatling 2 вы можете извлекать встроенные объекты с точечной нотацией). - person Stephane Landelle; 29.07.2014