【问题标题】:JMeter: How to count JSON objects in an Array using jsonpathJMeter:如何使用 jsonpath 计算数组中的 JSON 对象
【发布时间】:2014-10-20 21:00:48
【问题描述】:

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

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

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

读完这个:count members with jsonpath?,我尝试使用下面的 JSON 路径断言:

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

但是,这似乎无法正常工作。当我确实收到数组中的 5 个对象时,响应断言说它不匹配。

我做错了什么? 或者我还能怎么做?

【问题讨论】:

标签: arrays json path count jmeter


【解决方案1】:

虽然 JSONPath Extractor 不提供hasSize 功能,但它仍然可以完成。

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

1.最简单(但脆弱)的方式 - 使用 Regular Expression Extractor

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

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

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

它将捕获所有category 条目并返回匹配数,如下所示:

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

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

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

JMeter 有一个 Beanshell 脚本扩展机制,它可以访问范围内的所有变量/属性以及底层的 JMeter 和第 3 方依赖项 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变量中

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

参考资料:

【讨论】:

  • 感谢这些建议!现在我将使用正则表达式提取器的快速解决方案,这就足够了。但我稍后可能会使用 BeanShell PostProcessor。太棒了:-)
  • 更喜欢 JSR223 + Groovy 而不是 Beanshell,JMeter 性能更好,编码更好,因为 Groovy 对 JSON 和 XML 更强大并得到维护
  • 第一个参考链接 (alexandru-ersenie.com) 已过期。
【解决方案2】:

这对于您正在使用的插件(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 提取器:

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

${bookTitle_matchNr}

运行此测试计划将显示:

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

【讨论】:

  • 感谢您的建议!您的插件似乎非常有用,但现在我将使用 Dmitri 提到的正则表达式提取器解决方案。还是谢谢!
  • 没问题 :-) ,正如 Dmitri 所说,对 JSON 使用 Regexp 通常不是一件好事,而且 Beanshell 会导致大量自定义代码和可维护性 + 生产力问题,最终购买我们的插件是更好:-),但是如果你去编码,更喜欢 JSR223 + Groovy 而不是 Beanshell,JMeter 性能更好,编码更好,因为 Groovy 更强大且维护得更好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 2020-07-23
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-08
相关资源
最近更新 更多