首页 > 解决方案 > Gatling:将 findAll 转换为排序列表

问题描述

我是 scala 和 Gatling 的新手。我正在尝试将 findAll 的结果转换为排序列表,然后返回排序列表的字符串表示形式。我似乎无法使用以下代码执行此操作:

http(requestTitle)
  .post(serverUrl)
  .body(ElFileBody(sendMessageFile))
  .header("correlation-id", correlationId)
  .check(status.is(200),
    jsonPath("$.data.sendMessage.targetedRecipients").findAll.transform(recipients => {
      println("recipients class: " + recipients.getClass)
      var mutable = scala.collection.mutable.ListBuffer(recipients: _*)
      var sortedRecipients = mutable.sortWith(_ < _)
      println("users sorted "+ usersSorted)
      usersSorted.mkString(",")
  }).is(expectedMessageRecipients))

Recipients 的类型为 scala.collection.immutable.Vector。我以为我可以使用 scala.collection.mutable.ListBuffer 将不可变集合转换为可变集合。任何帮助将不胜感激,谢谢。

标签: scalagatlingscala-gatling

解决方案


我不认为您的问题是不变性,而是 JSON 解析与 Gatling 的 .find 和 .findAll 方法。

我会猜测你的反应看起来像......

{"data":{"sendMessage":{"targetedRecipients":[1,4,2,3]}}}

在这种情况下,Gatling 的 .findAll 方法将返回一个向量(它总是在找到某些东西时返回),但它只有一个元素,即 "[1,4,2,3]" - 即:表示 json 数据的字符串,因此对单个元素的集合进行排序自然不会取得任何成果。要让 .findAll 表现得像您期望的那样,您需要一个类似...的响应

{"data":
 {"sendMessage":
  {"targetedRecipients":
    [{"recipientId":1},
     {"recipientId":4},
     {"recipientId":2},
     {"recipientId":3}]
 }}}

您可以使用.jsonPath("$..recipientId").findAll它变成 Id 的 Vector[String]。

因此,假设您确实只是获得了一个值数组的单个字符串表示形式,您可以使用直接转换来生成一个数组并进行排序(正如您在示例中所尝试的那样)

这是一个工作版本

val data = """{"data":{"sendMessage":{"targetedRecipients":[1,4,2,3]}}}"""

def sortedArray : ScenarioBuilder = scenario("sorting an array")
.exec(http("test call")
.post("http://httpbin.org/anything")
.body(StringBody(data)).asJson
.check(
  status.is(200),
  jsonPath("$.json.data.sendMessage.targetedRecipients")
    .find
    .transform(_
      .drop(1)
      .dropRight(1)
      .split(",")
      .toVector
      .sortWith(_<_)
    )
    .saveAs("received")
))
.exec(session => {
  println(s"received: ${session("received").as[Vector[String]]}")
  session
})

推荐阅读