在Gatling / Scala中循环处理来自先前请求的多个响应匹配

时间:2019-11-26 13:28:41

标签: scala gatling

我对加特林/ Scala还是很陌生,所以如果我误解了一些显而易见的内容,我深表歉意,但是...

我有一个场景,其中包含一系列请求。其中之一是:

.exec (
  http("Get IDs")
  .post(<urlpath>)
  .body(<body text>)
  .headers(<headerinfo>)
  .check(jsonPath("$[*].some.json.path").findAll.transform(_.map(_.replace("unwantedchars,""))).saveAs(myIds)
)

这很好用,返回所有匹配的json元素的向量,并删除了不需要的字符。我接下来要做的是循环遍历前5个ID,并将其传递到下一个请求中。我尝试了以下各种变体,但没有任何变体/谷歌搜索返回了实际的解决方案:

.exec( session => {
  val firstFive = session("myIds").as[Vector[String]].toArray.take(5)
  for (inx <- 0 until 4){
    exec(
      http("get the item")
        .get("/path/to/item/thing/" + firstFive(inx))
        .headers(<etc etc>)
      )
  session
})

因此,我了解不支持嵌套的exec-但是如何创建一个结合了for循环和实际HTTP请求的块?

我缺少明显的东西吗?

1 个答案:

答案 0 :(得分:0)

如果您希望使用5,则只需将它们放入会话中,然后使用.foreach块对其进行处理。

因此,不要采取前五个方法并尝试进行exec调用(如您所观察的那样,该方法将不起作用),而是将列表保存回会话中

.exec( session => {
  val firstFive = session("myIds").as[Vector[String]].take(5)
  session.set("firstFive", firstFive)
)

然后使用DSL遍历集合

.foreach("${firstFive}", "id") {
  exec(
    http("get the item")
      .get("/path/to/item/thing/${id}")
      .headers(<etc etc>)
  )
}

您甚至可以将前五个选项添加到转换步骤中-这样整个事情就可以...

.exec (
  http("Get IDs")
    .post(<urlpath>)
    .body(<body text>)
    .headers(<headerinfo>) .check(jsonPath("$[*].some.json.path").findAll.transform(_.map(_.replace("unwantedchars,"")).take(5).saveAs(myIds)
)
.foreach("${myIds}", "id") {
  exec(
    http("get the item")
      .get("/path/to/item/thing/${id}")
      .headers(<etc etc>)
  )
}