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
,您必须将所有元素复制到新分配的对象中,因此它在任何方面都不是最佳选择。与 var
s 相同 - 您可以使用 val
s,因为您不更新引用
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
})
我是 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
,您必须将所有元素复制到新分配的对象中,因此它在任何方面都不是最佳选择。与 var
s 相同 - 您可以使用 val
s,因为您不更新引用
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
})