Gatling:将 findAll 转换为排序列表

Gatling: transform findAll to sorted list

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

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))

收件人类型为 scala.collection.immutable.Vector。 我以为我可以使用 scala.collection.mutable.ListBuffer 将不可变集合转换为可变集合。如有任何帮助,我们将不胜感激。

如果您只想对结果进行排序,则没有理由使用可变集合:

Vector(5,4,3,2,1).sortWith(_ < _).mkString(", ") // "1, 2, 3, 4, 5"

要使用 ListBuffer,您必须将所有元素复制到新分配的对象中,因此它在任何方面都不是最佳选择。与 vars 相同 - 您可以使用 vals,因为您不更新引用

println(s"recipients class: ${recipients.getClass}")
val result = recipients.sortWith(_ < _).mkString(", ")
println(s"users sorted $result")
result

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

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

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

在这种情况下,Gatling 的 .findAll 方法将 return 一个向量(如果找到某些东西,它总是这样做),但它只有一个元素,即“[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
})