如何在JMeter中提取JSON并随机化符合指定条件的数据?
随机提取符合条件的JSON字段并传递至下一个请求
问题背景
需要从服务器返回的以下JSON响应中,每次迭代随机提取title为"Sword of Honour"的书籍的author及其他字段,传递到下一个请求。当前使用带固定索引的JSONPath表达式时,会因索引对应的数据不符合条件而返回空值:
服务器响应JSON:
{ "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sword of Honour", "price": 8.95 }, { "category": "fiction", "author": "Evelyn Waugh", "title": "test_title", "price": 12.99 }, { "category": "fiction", "author": "Herman Melville", "title": "Sword of Honour", "isbn": "0-553-21311-3", "price": 8.99 }, { "category": "fiction", "author": "J. R. R. Tolkien", "title": "India", "isbn": "0-395-19395-8", "price": 22.99 } ], "bicycle": { "color": "red", "price": 19.95 } }, "expensive": 10 }
比如使用$..book[1][?(@.title == 'Sword of Honour')].author会返回空值,因为索引1对应的书籍title不符合条件。
解决方案
1. 先筛选所有符合条件的书籍集合
先用JSONPath表达式过滤出所有title等于"Sword of Honour"的书籍对象,得到一个完整的符合条件的数组:
$..book[?(@.title == 'Sword of Honour')]
执行后会得到如下结果数组:
[ { "category": "reference", "author": "Nigel Rees", "title": "Sword of Honour", "price": 8.95 }, { "category": "fiction", "author": "Herman Melville", "title": "Sword of Honour", "isbn": "0-553-21311-3", "price": 8.99 } ]
2. 从集合中随机选取一个元素
根据你使用的工具/语言,实现随机选取逻辑:
情况1:使用Postman等接口测试工具
在测试脚本中通过JavaScript实现筛选和随机选取,并将字段存入环境变量供下一个请求调用:
// 解析响应JSON const responseData = pm.response.json(); // 筛选所有title为"Sword of Honour"的书籍 const matchingBooks = responseData.store.book.filter(book => book.title === "Sword of Honour"); // 生成随机索引(范围0到符合条件的书籍数量-1) const randomIndex = Math.floor(Math.random() * matchingBooks.length); // 获取随机选中的书籍对象 const randomBook = matchingBooks[randomIndex]; // 将需要的字段存入环境变量 pm.environment.set("randomAuthor", randomBook.author); pm.environment.set("randomBookPrice", randomBook.price); pm.environment.set("randomBookCategory", randomBook.category);
之后在下一个请求中,通过{{randomAuthor}}等变量名引用即可。
情况2:使用Python处理
借助jsonpath-ng库筛选,再用random模块随机选取:
import json import random from jsonpath_ng import parse # 假设已获取服务器响应并解析为JSON对象 response_json = { # 服务器返回的完整JSON内容 } # 筛选符合条件的书籍 jsonpath_expr = parse("$..book[?(@.title == 'Sword of Honour')]") matching_books = [match.value for match in jsonpath_expr.find(response_json)] # 随机选取一个书籍对象 random_book = random.choice(matching_books) # 提取需要的字段 target_author = random_book["author"] target_price = random_book["price"] # 后续将这些字段值传入下一个请求即可
3. 核心思路
不要先指定数组索引再过滤,而是先过滤得到符合条件的完整集合,再从集合中随机选取,这样就能避免固定索引对应的数据不符合条件的问题。
内容的提问来源于stack exchange,提问作者Kaushal Kumar
相关产品推荐
相关产品推荐

