【问题标题】:Gatling: transform findAll to sorted listGatling:将 findAll 转换为排序列表
【发布时间】:2020-03-27 13:46:56
【问题描述】:

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

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

【问题讨论】:

  • 如果您只想对结果进行排序,那么您没有理由在这里使用可变集合。
  • 调用 recipients.sortWith(_
  • Vector("5","4","3","2","1").sortWith(_ &lt; _).mkString(", ") == "1, 2, 3, 4, 5" - 向量是不可变的,因此它不会在原地改变代码 但它返回更新的副本 - 只需将结果存储在变量,因为您将其用作表达式而不是语句。
  • 我知道它返回了一个更新的副本,我尝试按照您的建议将 sortWith 的结果存储在不同的变量中,但它对我不起作用。
  • 你确定这是一个不可变向量吗?

标签: scala gatling scala-gatling


【解决方案1】:

我不认为您的问题是不变性,而是 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
})

【讨论】:

  • 谢谢,问题是 findAll 返回了一个长度为 1 的向量
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2010-11-02
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    相关资源
    最近更新 更多