Scala Gatling:将findAll转换为排序列表

Scala Gatling:将findAll转换为排序列表,scala,gatling,scala-gatling,Scala,Gatling,Scala Gatling,我是斯卡拉和加特林的新手。我试图将findAll的结果转换为排序列表,然后返回排序列表的字符串表示形式。我似乎无法使用以下代码执行此操作: http(requestTitle) .post(serverUrl) .body(ElFileBody(sendMessageFile)) .header("correlation-id", correlationId) .check(status.is(200), jsonPath("$.data.sendMessage.targ

我是斯卡拉和加特林的新手。我试图将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))
http(requestTitle)
.post(服务器URL)
.body(ElFileBody(sendMessageFile))
.header(“相关id”,correlationId)
.检查(状态为(200),
jsonPath($.data.sendMessage.targetedRecipients”).findAll.transform(收件人=>{
println(“收件人类:+recipients.getClass”)
var mutable=scala.collection.mutable.ListBuffer(收件人:*)
var sortedRecipients=mutable.sortWith(
收件人的类型为scala.collection.immutable.Vector。
我想我可以使用scala.collection.mutable.ListBuffer将不可变集合转换为可变集合。感谢您的帮助。

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

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

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

我猜你的回答有点像

{"data":{"sendMessage":{"targetedRecipients":[1,4,2,3]}}}
{"data":
 {"sendMessage":
  {"targetedRecipients":
    [{"recipientId":1},
     {"recipientId":4},
     {"recipientId":2},
     {"recipientId":3}]
 }}}
在这种情况下,Gatling的.findAll方法将返回一个向量(如果它找到某个元素,它总是会返回),但它只有一个元素是“[1,4,2,3]”,即:一个表示json数据的字符串,因此对单个元素的集合进行排序自然不会产生任何效果。要让.findAll表现得像你期待的那样,你需要一个类似于

{"data":{"sendMessage":{"targetedRecipients":[1,4,2,3]}}}
{"data":
 {"sendMessage":
  {"targetedRecipients":
    [{"recipientId":1},
     {"recipientId":4},
     {"recipientId":2},
     {"recipientId":3}]
 }}}
您可以使用
.jsonPath($…recipientId”).findAll
将其转换为ID的向量[字符串]

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

这是一个有效的版本

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
})
val data=“{”data:{“sendMessage:{”targetedRecipients:[1,4,2,3]}}”
def sortedArray:ScenarioBuilder=场景(“排序数组”)
.exec(http(“测试调用”)
.post(“http://httpbin.org/anything")
.body(StringBody(data)).asJson
.检查(
状态。is(200),
jsonPath($.json.data.sendMessage.targetedRecipients)
.找到
.变换(_
.下降(1)
.dropRight(1)
.拆分(“,”)
toVector先生
sortWith先生({
println(s“received:${session(“received”).as[Vector[String]]})
一场
})

如果您只想对结果进行排序,那么您没有理由在这里使用可变集合。调用recipients.sortWith(<;)不会对字符串集合进行排序。我的想法是因为它是不可变的。
向量(“5”、“4”、“3”、“2”、“1”)。sortWith(<;).mkString(“,”=“1、2、3、4、5”
-vector是不可变的,因此它不会在适当的位置对代码进行变异,但会返回更新的副本-只需将结果存储在变量中,因为您将其用作表达式而不是语句。我知道它会返回更新的副本,我尝试按照您的建议将sortWith的结果存储在不同的变量中,但它对我不起作用。是吗你确定这是一个不可变的向量吗?谢谢,问题是findAll返回了一个长度为1的向量