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

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

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

[{…},{…},{…}]

阅读本文后:count members with jsonpath?,我尝试使用以下JSON Path Assertion:

> JSON路径:$
>预期价值:hasSize(5)
>根据预期值进行验证=已选中

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

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

解决方法

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

给出PMD UBIK-INGENIERIE答案中的示例JSON,您可以至少以两种方式获得书籍数组的匹配数:

1.容易(但脆弱)的方式 – 使用Regular Expression Extractor.

如您所见,有4个类别的条目,如:

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

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

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

因此,您可以在需要的地方使用此${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变量中

以后可以在If子句或断言中重用.

参考文献:

> JMeter – Working with JSON – Extract JSON response
> JMeter’s User Manual Regular Expressions entry
> JSON Path Documentation and Examples
> How to use BeanShell: JMeter’s favorite built-in component

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...