1 概述
接口测试或者性能测试,常常需要动态提取上个请求返回的内容,JMeter工具可以使用后置处理器进行处理,以下是JMeter常用的提取器。
我们最常用的JMeter正则表达式提取器和边界提取器,依赖前后文或者内容格式的稳定,有时匹配多个,无法保证每次精准提取到正确的那一个,导致脚本无法稳定,而Json提取器可以定位到字段,无论字段内容如何变化,都可以精准提取,受前后内容影响不大。
本文将通过理论和实例为大家介绍JMeter的Json提取器。
2 Json提取器
使用JSON- path语法从JSON响应中提取数据,非常类似于正则表达式提取器,它将允许您以一种非常简单的方式提取文本内容。具体可参见JSON路径语法(来源于https://github.com/ Json -path/ Json Path 的官方介绍,大家可以前往获取更详细的内容)。
一、操作符介绍
二、用法介绍
Json操作示例
提取某个字段内容,普遍适用的思路是先定位到节点再提取节点内字段名,如果想获取上图color字段的内容,我们可以写成:$.store.bicycle.color。
在线验证成功:
更多表达式请见下表,可以在网上找提取器进行实战练习(推荐网址:https://www.lddgo.net/string/Jsonpath),输入上面的Json内容和表达式,查看获取到的结果。
3 Json实例1 -提取苍穹界面的pageId
实例:提取首页应用页签的pageId.需要从返回内容中提取(根据经验所得,如果不知道从哪个请求响应提取pageId,可以将本请求的pageId,向上查找搜索)。
谷歌浏览器“Preview”可以清晰的展示Json格式,推荐使用。
通过“Preview”展开请求的响应内容,我的应用“pageId”如下图所示。
根据1.2的用法介绍,我们可以得出提取该pageId的四种方法。
1)、第一种写法:第一步,确定节点,从上图Preview中可以看到需要提取的应用页签pageId在根节点下的第2个子节点内p字段的第8个子节点,于是表达式为:$[2].p[8]使用JMeter的Json提取器进行验证,验证成功。
第二步,确认节点内的哪个字段,这里取pageId。
于是表达式为$[2].p[8].pageId,如下图,验证成功。
2)、第二种写法:第一步确定节点,拿同节点内的某个键值对来定位,比如这里可以通过a:”showForm”定位到$[2]节点,formId:”tenant_myapp”定位到p[8]节点。
第二步,确定字段,字段为pageId,于是表达式可以写成:
$[? (@.a=="showForm")].p[?(@.formId=="tenant_myapp")].pageId,如下图,验证成功。
3)、第三种写法,通过上面介绍的用法,在我们确认formId: "tenant_myapp"唯一的情况下,可以直接提取符合条件的节点,而不用考虑节点的继承关系。
于是表达式可以写成:$..[?(@.formId=="tenant_myapp")].pageId,(..搜索符合条件的节点)如下图,验证成功。
4)、第四种写法,不考虑节点,直接提取所有pageId的值,再使用数组下标提取。
表达式:$..pageId,验证结果提取27条pageId的值
可以看到我们要提取的结果在第9条,于是Json提取器可以写成
四个表达式,相同的结果:
表达式一:$[2].p[8].pageId
表达式二:$[?(@.a=="showForm")].p[?(@.formId=="tenant_myapp")].pageId
表达式三:$..[?(@.formId=="tenant_myapp")].pageId
表达式四:$..pageId,由于提取了多条,需要JSON提取器标识匹配第几个值
对比:
表达式一,依赖数据结构的固定,表达式需固定提取数组下标$[2].p[8]的内容
表达式二,书写复杂,并且需要理清节点的继承关系
表达式三,精准定位到需要提取内容的节点,且表达式相对简单
表达式四,表达式最简单,但是提取到多条时,需要标识第几个值,也依赖于响应内容的固定和稳定。
表达式一和表达式四并没有解决依赖于响应内容或格式固定的问题,表达式二过于复杂,此种情况推荐使用表达式三。既简单又无需清楚Json内容的具体结构。
如果pageId结果集唯一,推荐直接使用$..pageId提取pageId。
4 实例2 -快速提取查询返回的数据
我们经常需要提取查询请求返回的数据做进一步处理,苍穹系统查询请求返回的数据一般在字段为rows的内容中,由于rows唯一,提取的表达式可直接使用:$..rows
如下图,验证成功。
JSON提取器可以设置为:
5 总结
1、 Json提取器可以精准提取字段内容,无论字段内容如何变化。
2、 Json是一种普遍存在的数据交换格式,Json提取器可以广泛使用。
3、 提取内容的原则:精准提取,表达式简单。
4、 表达式书写方式需要大家在工作中多加练习, 方能熟练掌握众多组合用法的精髓。
5、Json提取器提取出来的变量通常可以作为JMeter变量给其他多个请求使用,如果请求返回结果是Json类型,使用Json提取器比正则表达式更加方便, 效率方面也会更好。
6、如果需要提取的字段唯一,推荐使用$..字段名,无需考虑节点的继承关系。
参考资料:
JsonPath介绍(github):https://github.com/Json-path/JsonPath