Gatling中如何用JsonPath实现LoadRunner风格IDX功能?
解决Gatling中类似LoadRunner IDX功能的实现方案
针对你需要完成的三个操作,结合Gatling的Session上下文特性与JSON处理机制,给出可行的实现方案:
核心实现步骤
- 从JSON中过滤出
user字段值为same的条目,统计其数量并存入Session - 基于统计出的数量,在Session中生成合法范围内的随机索引
- 根据随机索引提取对应条目的
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
相关产品推荐
相关产品推荐

