You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gatling中如何用JsonPath实现LoadRunner风格IDX功能?

解决Gatling中类似LoadRunner IDX功能的实现方案

针对你需要完成的三个操作,结合Gatling的Session上下文特性与JSON处理机制,给出可行的实现方案:

核心实现步骤

  1. 从JSON中过滤出user字段值为same的条目,统计其数量并存入Session
  2. 基于统计出的数量,在Session中生成合法范围内的随机索引
  3. 根据随机索引提取对应条目的book_title值,存入变量供后续使用

完整代码示例

import io.gatling.core.Predef._
import io.gatling.jsonpath.JsonPath

val testjson = """{
  "Books": [
    {
      "book_title": "bookTitle21",
      "user": "same"
    },
    {
      "book_title": "bookTitle73",
      "user": "same"
    },
    {
      "book_title": "bookTitle0",
      "user": "admin"
    }
  ]
}"""

val scn = scenario("RandomBookPicker")
  .exec(session => {
    // 1. 过滤并统计user为same的书籍条目数量
    val sameUserBooks = JsonPath.query("$.Books[?(@.user == 'same')]", testjson).right.get
    session.set("sameBookCount", sameUserBooks.size)
  })
  .exec(session => {
    // 2. 生成0到count-1之间的随机索引
    val count = session("sameBookCount").as[Int]
    val randomIdx = scala.util.Random.nextInt(count)
    session.set("randomIndex", randomIdx)
  })
  .exec(session => {
    // 3. 根据索引获取对应的book_title
    val sameBookTitles = JsonPath.query("$.Books[?(@.user == 'same')].book_title", testjson).right.get
    val targetBook = sameBookTitles(session("randomIndex").as[Int])
    session.set("randomBookTitle", targetBook)
  })
  .exec(session => {
    // 验证结果(可选)
    println(s"随机选中的书籍标题:${session("randomBookTitle").as[String]}")
    session
  })

原代码问题说明

  • 拼写错误:JonPath应为JsonPath
  • 脱离Session上下文:直接使用util.Random.nextInt(userCount)无法获取Session中的变量值,必须在exec代码块内操作Session数据
  • JsonPath插值错误:Gatling不支持直接在JsonPath表达式中用#{randomIndex}插值,需先提取过滤后的列表再通过索引取值

替代方案(基于Jackson)

如果偏好使用Jackson处理JSON,可参考以下实现:

import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.ObjectMapper
import io.gatling.core.Predef._

val mapper = new ObjectMapper()
val testjson = """{
  "Books": [
    {
      "book_title": "bookTitle21",
      "user": "same"
    },
    {
      "book_title": "bookTitle73",
      "user": "same"
    },
    {
      "book_title": "bookTitle0",
      "user": "admin"
    }
  ]
}"""

val scn = scenario("RandomBookPickerWithJackson")
  .exec(session => {
    val rootNode: JsonNode = mapper.readTree(testjson)
    val booksNode = rootNode.get("Books")
    // 过滤出user为same的book_title列表
    val sameUserBooks = (0 until booksNode.size()).flatMap(idx => {
      val bookNode = booksNode.get(idx)
      if (bookNode.get("user").asText() == "same") Some(bookNode.get("book_title").asText()) else None
    }).toList
    session.set("sameBookList", sameUserBooks)
  })
  .exec(session => {
    val bookList = session("sameBookList").as[List[String]]
    val randomIdx = scala.util.Random.nextInt(bookList.size)
    session.set("randomBookTitle", bookList(randomIdx))
  })

内容的提问来源于stack exchange,提问作者Forrestman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 01:10:24