繁体   English   中英

JMeter:如何使用jsonpath计算数组中的JSON对象

[英]JMeter: How to count JSON objects in an Array using jsonpath

在JMeter中,我想检查从服务器收到的JSON数组中的对象数。

例如,在某个请求中,我期望一个包含5个对象的数组。

[{...},{...},{...},{...},{...}]

看完之后: 用jsonpath计算成员? ,我尝试使用以下JSON路径断言:

  • JSON路径:$
  • 预期价值:hasSize(5)
  • 验证预期值=已检查

但是,这似乎不能正常工作。 当我确实在数组中接收到5个对象时,响应断言表明它不匹配。

我究竟做错了什么? 或者我怎么能这样做?

虽然JSONPath Extractor不提供hasSize函数,但仍然可以完成。

鉴于PMD UBIK-INGENIERIE答案中的示例JSON,您可以通过至少两种方式获得book数组的匹配数:

1.最简单(但最脆弱)的方式 - 使用正则表达式提取器

如您所见,有4个category条目,如:

{ "category": "reference",
{ \"category\": \"fiction\"
...

如果添加如下配置的正则表达式提取器:

JSON正则表达式

它将捕获所有category条目并返回匹配号码如下:

JSON正则表达式匹配

因此,您可以在需要的地方使用此${matches_matchNr}变量。

这种方法简单易行,但很容易受到响应格式的任何变化的影响。 如果您预计JSON数据可能在可预见的未来发生变化,请继续使用下一个选项。

2.更难(但更稳定)的方式 - 从Beanshell PostProcessor调用JsonPath方法

JMeter有一个Beanshell脚本扩展机制,可以访问范围内的所有变量/属性以及底层JMeter和第三方依赖项API。 在这种情况下,您可以直接从Beanshell PostProcessor调用JsonPath库(位于JsonPath Extractor的引擎盖下)。

import com.jayway.jsonpath.Criteria;
import com.jayway.jsonpath.Filter;
import com.jayway.jsonpath.JsonPath;

Object json = new String(data);
List categories = new ArrayList();
categories.add("fiction");
categories.add("reference");
Filter filter = Filter.filter(Criteria.where("category").in(categories));
List books = JsonPath.read(json, "$.store.book[?]", new Filter[] {filter});

vars.put("JSON_ARRAY_SIZE", String.valueOf(books.size()));

上面的代码针对父采样器响应计算$.store.book[?] JSONPath表达式,计算匹配数并将其存储到${JSON_ARRAY_SIZE} JMeter变量中

JSON Beanshell变量

以后可以在if子句或断言中重用。

参考文献:

使用您正在使用的插件(JMeter-plugins)无法做到这一点。

但是自JMeter 3.0以来可以用JSON Extractor完成,这个插件已经由UbikLoadPack捐赠( http://jmeter.apache.org/changes_history.html

例:

假设你有这个包含一系列书籍的JSON:

   { "store": {"book": [
      { "category": "reference","author": "Nigel Rees","title":      "Sayings of the Century","price": 8.95},
      { "category": "fiction","author": "Evelyn Waugh","title": "Sword of Honour","price": 12.99},
      { "category": "fiction","author": "Herman Melville","title": "Moby Dick","isbn": "0-553-21311-3","price": 8.99},
      { "category": "fiction","author": "J. R. R. Tolkien","title": "The Lord of the Rings","isbn": "0-395-19395-8","price": 22.99}
   ],
    "bicycle": {"color": "red","price": 19.95}} }

要算这个:

1 /添加JSON提取器:

JSON Extractor配置

然后,计数将可用bookTitle_matchNr,您可以通过以下方式访问:

$ {} bookTitle_matchNr

运行此测试计划将显示以下内容:

运行结果

如您所见,Debug Sampler - $ {bookTitle_matchNr}显示Debug Sampler-4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM