JMETER从JSON响应中提取数据

如果你在这里,可能是因为你需要使用JMeter从Json响应中提取变量。

好消息!您正在掌握掌握JMeter Json Extractor的权威指南。作为Rest API测试指南的补充,您将学习掌握Json Path Expressions 所需的一切。

我们走吧!并且不要惊慌,那里没有什么困难。

Json格式

为了更好地理解Json是什么,这是一个示例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 } ], "bicycle": { "color": "red", "price": 19.95 } }, "expensive": 10 } 

Json是一种非常简单的数据格式,几年前就已经接管了XML。

你可能会问自己:为什么我需要学习Json?

越来越多的REST API和服务器使用Json作为主要的数据交换格式。在OctoPerf,我们大量使用Json在AngularJS前端客户端和Spring Boot后端之间交换数据。

想知道最好的部分吗?

从JMeter 3.0开始,使用Json变量提取器从Json响应中提取数据要容易得多。换句话说,Json提取器可以原生使用。

JMeter JsonPath插件

JMeter Json插件

JMeter JsonPath Extractor插件可以从jmeter-plugins网站下载和安装。从JMeter 3.0及更高版本开始,Json插件是可选的。

安装JMeter JsonPath插件

  • 下载plugins-manager.jar并将其放入JMETER_HOME/lib/ext目录,
  • 重启JMeter,
  • 点击Options > Plugins Manager顶部菜单,
  • 选择Available Plugins标签,
  • 选择Json Plugins并单击Apply Changes并重新启动JMeter

在JMeter的Json的插件应该在右键菜单Add > Post Processors > Json Path Extractor。顺便说一句,我们建议您阅读我们的JMeter插件安装指南,了解有关JMeter插件的更多详细信息。

你懒吗?因为我是。让我们使用原生的JsonPath Extractor!

JMeter Json Path Extractor

JMeter的Json Post处理器使用Json Way,一种Java Json Path API,在服务器响应上执行JSon路径提取。

JMeter Json后处理器

Json Path提取器应放在HTTP Sampler下。它有几种可能的设置,因此最相关的是:

  • 变量名称:分号单独的变量名称,
  • JSON Path Expressions:从json响应中提取内容的表达式,
  • 匹配数字:-1对于所有,0对于随机的,n对于第n个,
  • Compute concatenation var:创建一个${foo_ALL}包含所有提取值的串联的变量,
  • 和默认值:如果表达式不适用于正在处理的json文档。

真棒!但是我该如何开始?

示例Json路径

以下是一些示例Json Path表达式,可用于从上面公开的Json文档中提取数据:

JsonPath(点击链接试试)结果
$ .store.book [*]。作者所有书籍的作者
$ ..作者所有作者
$ .store。*所有的东西,书籍和自行车
$ .store..price一切的价格
$ ..本书[0,1]前两本书
$ ..书[2]从索引0(含)到索引2(独家)的所有书籍
$ ..书[2:]从尾巴预订二号
$ ..书[?(@。ISBN)所有ISBN编号的书籍
$ .store.book [?(@。price <10)]商店里的所有书籍都比10便宜
$ .. book [?(@。price <= $ ['expensive'])]店内所有书籍都不“贵”
$ .. book [?(@。author =〜/.* REES / i)]所有与正则表达式匹配的书籍(忽略大小写)
$ .. *把所有东西都给我
$ .. book.length()书籍数量

如您所见,从Json文档中查询特定信息并将它们放入变量中非常简单灵活。让我们用JMeter探索上面的一些例子。

你猜怎么着?我们打算试一试。

真实的JMeter示例

JMeter Json Extractor样品JMX

我们的示例JMX展示了JMeter Json Extractor和Plugin JsonPath Extractor的工作原理。在JMeter 3.0之前,需要插件执行JsonPath提取。从JMeter 3.0开始,Json Extractions得到了集成支持。

准备采取一些行动?我们走吧!

阵列提取

JMeter Json Extractor阵列从商店中提取所有作者

提取数组可以一次从单个Json文档中提取多个值。例如,我们可以从书店中提取所有作者:

  • 变量名称:authors产生变量${authors}
  • JSONPath Expression : $..author,从任何深度选择所有作者。

您将获得以下变量:

authors_1=Nigel Rees
authors_2=Evelyn Waugh
authors_3=Herman Melville
authors_4=J. R. R. Tolkien
authors_ALL=Nigel Rees,Evelyn Waugh,Herman Melville,J. R. R. Tolkien (if Compute concatenation checked) authors_matchNr=4 

JMeter Json Extractor阵列我们得到了所有书籍的所有作者!

条件提取

JMeter Json选择性萃取有选择地提取书籍标题

现在假设我们想要提取价格小于或等于10的书籍的标题:

  • 变量名称:titles产生${titles}变量,
  • 比赛号码:-1
  • JSONPath表达式 :( $.store.book[?(@.price<= 10)].title图书标题的价格<= 10)。

您将获得以下变量:

titles_1=Sayings of the Century
titles_2=Moby Dick
titles_matchNr=2

JMeter选择性Json提取价格低于10的书籍。

多次提取

JMeter Json多次提取提取书籍作者和标题

现在假设我们想要同时提取多个Json字段。例如,我们想查询所有作者和标题:

  • 变量名称:multiple
  • 比赛号码:-1
  • JSONPath表达式:$..['author','title']

您将获得以下变量:

multiple_1={"title":"Sayings of the Century","author":"Nigel Rees"} multiple_2={"title":"Sword of Honour","author":"Evelyn Waugh"} multiple_3={"title":"Moby Dick","author":"Herman Melville"} multiple_4={"title":"The Lord of the Rings","author":"J. R. R. Tolkien"} multiple_matchNr**=4 

JMeter Json多次提取结果提取书籍作者和标题

这就是JMeter UI中显示的结果。

连接提取

有时,您希望将所有结果提取并连接成单个字符串。在这个例子中,我采用了HTTPBin头 json端点。

这可以使用该Compute Concatenation var (suffi _ALL)选项实现。

JMeter Json连接提取结果从JMeter调用HTTPBin时收到Json响应

端点返回包含客户端发送的标头的json。你应该看到类似的东西:

{"headers": {"Connection": "close", "Host": "httpbin.org", "User-Agent": "Apache-HttpClient/4.5.5 (Java/1.8.0_161)" } } 

现在让我们修改Json提取器并启用连接结果的选项:

  • 创建变量的名称 :( foo产生${foo}),
  • JSON路径表达式:$.headers.*
  • 匹配Nr:-1这意味着提取所有出现的,
  • 计算连接var:选中。

现在让我们看看结果。

JMeter Json连接提取结果提取所有结果的串联

最后,让我们使用Debug Sampler来查看正在提取的变量(foo在此处命名)。

JMeter Json连接提取结果调试结果

结果应该是这样的:

foo_1=close
foo_2=httpbin.org
foo_3=Apache-HttpClient/4.5.5 (Java/1.8.0_161) foo_ALL=close,httpbin.org,Apache-HttpClient/4.5.5 (Java/1.8.0_161) foo_matchNr=3 

这有用吗?我不太确定。但是,只要您有这种特殊需求,JMeter就能轻松完成。

使用响应断言

这是一个非常常见的问题:如何使用断言验证从json中提取的变量?

否则,您要确保提取的变量是正确的。让我们看看如何做到这一点。

JMeter Json Dummy SamplerJMeter Dummy Sampler插件

对于此示例,我们将使用Dummy Sampler插件。为什么?因为它允许使用我们想要的任何json生成样本结果。

让我们使用以下Json:

{"firstname": "John","lastname": "Smith"
}

我们只是将配置虚拟采样器以将此Json作为响应发送。

JMeter Json Dummy SamplerJMeter Dummy Sampler插件配置

然后,我们创建一个Json提取器来提取firstnamejson字段。

JMeter Json Dummy SamplerJMeter Json Extractor

现在让我们配置一个响应断言。

响应断言必须位于之后的JSON提取才能工作。

JMeter响应断言变量使用Response Assertion验证变量值

的响应断言被配置如下:

  • 应用于:要使用的JMeter变量名称,
  • 要测试的字段:文本响应,
  • 模式匹配规则:等于,
  • 要测试的模式:John在我们的示例中。

是时候执行线程组并查看结果了。

JMeter响应断言成功断言成功通过

如果我们替换断言模式来测试titi

JMeter响应断言成功断言失败了

大!现在您知道如何从json响应中提取变量并使用Response Assertion验证变量值。

3常见错误

现在,你可能想知道:什么可能出错?

应该避免的3个常见错误是:

  • 不要在单个Json Path提取器中定义多个变量:脚本可能变得难以理解/维护,
  • 不要编写易受特定json响应影响的表达式,试着坚持一般情况,
  • 解决方案越简单,脚本可维护性就越好。

很高兴知道解决方法

根据具体情况,您可以使用其他技术从服务器响应中提取内容。

正则表达式提取器

假设您有一个非常简单的Json文档,其中包含以下内容,并且您需要所有名字:

{"name":"Simpsons family","members":[{"firstName":"Homer", "lastName":"Simpson"}, {"firstName":"Marge", "lastName":"Simpson"}, {"firstName":"Bart", "lastName":"Simpson"} ] } 

在这种情况下,正则表达式提取器可能很适合,因为编写正则表达式非常简单。

JMeter Regexp后处理器

我们定义了以下设置:

  • 参考名称:firstname_RegEx
  • 正则表达式:"firstName":"(.+?)"
  • 模板: $1$
  • 匹配Nr : 3,(我们想要Bart
  • 默认值:D'oh!

JSR223与外部库

通过使用Minimal Json库并将其添加到JMeter,您也可以从服务器响应中提取json数据。

使用外部Lib配置JMeter

  • 下载Minimal Json Library最新版本,
  • 把它放进去<JMeter Home>/lib/ext
  • 重启JMeter。

现在在Http Sampler下创建一个JSR223 Post处理器,其服务器响应是一个Json文档。从以下脚本中选择Java语言并激发灵感:

import com.eclipsesource.json.JsonObject;String jsonString = prev.getResponseDataAsString(); 
JsonArray members = Json.parse(jsonString).asObject().get("members").asArray();
vars.put("firstName",String.valueOf(members.get(2).getString("firstName",""))); 

上面的代码提取第三个家族成员的firstName并将其放在一个变量中。

JSR223与Groovy

JSR223 PostProcessor具有Groovy语言支持,它具有内置的JSON支持,因此您不必添加任何.jars。示例代码:

import groovy.json.JsonSlurperdef jsonSlurper = new JsonSlurper();
def response = jsonSlurper.parseText(prev.getResponseDataAsString());
vars.put("firstName", response.members[2].firstName.toString());

${firstname}可以根据需要再后来被重用。

BeanShell Json Extractor

尽管使用BeanShell后处理器可以获得相同的结果,但出于性能原因,我们不建议这样做。应该使用JSR223后处理器来支持BeanShell后处理器。使用Groovy的JSR223比BeanShell快几个级别。

BeanShell Regexp后处理器

配置与JSR223非常相似。这里我们有最终变量${firstname_BSH}

JMeter插件(Json Path Extractor)

从JMeter 3.0开始,JMeter Json Extractor插件应该被放弃,以支持内置的Json Path提取器。如果您使用的是JMeter, 此插件仍然有用<= 2.13

Json Path JMeter插件

用例

Json提取器在以下情况下特别有用:

  • Json REST Apis:越来越多的休息apis基于Json,
  • OAuth身份验证机制,使用Json发送和接收访问权限和刷新令牌,
  • 单页Web应用程序(主要看到React或AngularJS)与JSon REST后端通信。

最后的话

这个巨大的Json教程即将结束!可是等等?它尚未完成!

您可能有兴趣查看我们的其他指南:

  • XPath Extractor:从XML响应中提取内容(如SOAP,
  • CSS Jquery Extractor:使用css选择器从HTML响应中提取内容,
  • 众所周知的Regex Extractor:使用正则表达式来提取部分响应。

转载于:https://www.cnblogs.com/a00ium/p/10388389.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos7安装oracle12c 二

环境&#xff1a;CentOS7VMware12&#xff0c;分配资源&#xff1a;CPU&#xff1a;2颗&#xff0c;内存&#xff1a;4GB&#xff0c;硬盘空间&#xff1a;30GB Oracle 12C企业版64位 下载地址&#xff1a;http://www.oracle.com/technetwork/database/enterprise-edition/down…

阿里云天池 Python训练营Task5:Python训练营测试 学习笔记

一、学习知识点概要 本次是Python训练营的测试&#xff0c;在45分钟内完成25题&#xff0c;满分100分及格80分。题目主要考察Task1到Task3里面的Python基础知识。在我随到的25道题里&#xff0c;知识点有&#xff1a; 变量&#xff08;包括数据类型和容器类型&#xff09;运算…

centos7安装oracle12c 三

场景描述&#xff1a;我在自己电脑的虚拟机上linux环境下安装oracle11g数据库。 Linux版本为&#xff1a;CentOS release 6.8 (Final)&#xff0c;Oracle版本为&#xff1a;linux.x64_11gR2 问题描述&#xff1a;在oracle安装到Prerequisite Checks这一步的时候&#xff0c;出现…

mysql删除一条记录

mysql如何删除一条记录delete from 表名 where 条件实例&#xff1a;use db1delete from tb1 where id 1; 转载于:https://www.cnblogs.com/effortsing/p/10393229.html

HBase体系结构

HBase HBase是Apache Hadoop的数据库&#xff0c;基于HDFS文件系统 random,realtime read/write access to Big Data 开源、分布式、可扩展、面向列 larger tables--billions of rows X millions of columns 不支持表链接操作 不支持事务处理 HBase存储的数据从逻辑上来…

《属性数据分析引论》 部分课后习题R语言实践(第三章、第四章)

目录 前言 第三章 广义线性模型 习题3.18 a小题 b小题 c小题 d小题 习题3.19 a小题 b小题 c小题 第四章 Logistic回归 习题4.1 a小题 b小题 c小题 d小题 e小题 习题4.2 a小题 b小题 c小题 d小题 小结 前言 习题选自高等教育出版社译制&#xff0c;Alan A…

Linux下SVN搭建

在Linux系统中搭建svn服务所需要用到的软件叫做subversion&#xff0c;可以通过yum来进行安装&#xff0c;如图 安装好软件后第一件事就是创建一个仓库目录 [rootserver1 ~]# mkdir /svn 使用svn自带命令建立仓库 [rootserver1 ~]# svnadmin create /svn 进入该仓库&#xff0c…

HBase模式设计

HBase的使用是为了解决或优化某一问题 恰当的设计模式可以使其具有HBase本身所不具有的功能&#xff0c;并且使其执行效率得到成百上千倍的提高 在进行HBase数据库模式设计的时候&#xff0c;不当的设置可能对系统的性能产生不良的影响 需要注意&#xff1a; 1、列族的数量及…

C++STL特殊容器priority_queue

在了解priority_queue&#xff08;优先队列&#xff09;前&#xff0c;可以先去瞅瞅queue&#xff0c;下面是传送门啦>——< 传送门 priority_queue的基本性能 class priority_queue<>实现出一个queue&#xff0c;只不过其中的元素依照优先级被读取。priority_queu…

可用于多元正态的参数估计 及 均值向量和协差阵检验 的R语言函数总结

一、多元正态的参数估计 1.1 样本均值 在R语言中&#xff0c;均值通常用函数mean()得到&#xff0c;但是mean()只能计算一维变量的样本均值&#xff0c;在面对多元随机变量的样本时&#xff0c;假设我们以数据框的形式保存样本&#xff0c;我们有以下方法可以得到样本均值&…

30秒的PHP代码片段-MATH

本文来自GitHub开源项目 点我跳转 30秒的PHP代码片段 精选的有用PHP片段集合&#xff0c;您可以在30秒或更短的时间内理解这些片段。数学函数 average 返回两个或多个数字的平均值。 function average(...$items) { $count count($items); return $count 0 ? 0 : array_sum(…

Hive简介

Hive最初是应Facebook每天产生的海量新兴社会网络数据进行管理和机器学习的需求而产生和发展的 是建立在Hadoop上的数据仓库基础架构 作为Hadoop的一个数据仓库工具&#xff0c;Hive可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供简单的SQL查询功能 Hive作为数…

可用于 线性判别、聚类分析 的R语言函数总结

一、判别分析 判别分析是一种分类技术&#xff0c;其通过一个已知类别的“训练样本”来建立判别准则&#xff0c;并通过预测变量来为未知类别的数据进行分类。根据判别的模型分为线性判别和非线性判别&#xff0c;线性判别中根据判别准则又分为Fisher判别&#xff0c;Bayes判别…

Linux 环境下搭建 Jenkins(Hudson)平台

安装jenkins&#xff1a;安装 jenkins 有两种方式&#xff1a;安装方式一&#xff1a; [java] view plaincopysudo java -jar jenkins.war –httpPort18080 –ajp13Port18009 但是很多时候我们是使用SSH方式到目标机器上的&#xff0c;放我们关闭SSH连接时&#xff0c;这个命…

Android APK 打包过程 MD

Markdown版本笔记我的GitHub首页我的博客我的微信我的邮箱MyAndroidBlogsbaiqiantaobaiqiantaobqt20094baiqiantaosina.comAndroid APK 打包流程 MD 目录 目录APK 的打包流程整体流程资源的编译和打包资源ID资源索引概况具体打包过程aapt阶段aidl阶段Java Compiler阶段dex阶段a…

可用于 主成分分析、R型因子分析、简单相应分析 的R语言函数总结

一、主成分分析 主成分分析是多元统计分析的一种常用的降维方法&#xff0c;它以尽量少的信息损失&#xff0c;最大程度将变量个数减少&#xff0c;且彼此间互不相关。提取出来的新变量成为主成分&#xff0c;主成分是原始变量的线性组合。 1.1 KMO检验和Bartlett球形检验 在…

[国家集训队]墨墨的等式

Description 墨墨突然对等式很感兴趣&#xff0c;他正在研究a1x1a2y2…anxnB存在非负整数解的条件&#xff0c;他要求你编写一个程序&#xff0c;给定N、{an}、以及B的取值范围&#xff0c;求出有多少B可以使等式存在非负整数解。 Input 输入的第一行包含3个正整数&#xff0c;…

Storm简介

Storm是实时流式数据处理框架&#xff0c;支持多种编程语言 应用案例&#xff1a; realtime analytics online machine learning continuous computation distributed RPC ETL 性能&#xff1a;a million tuples per second per node 可扩展、高容错 结合消息队列和数据库…

持续集成之Jenkins安装部署

安装JDKJenkins是Java编写的&#xff0c;所以需要先安装JDK&#xff0c;这里采用yum安装&#xff0c;如果对版本有需求&#xff0c;可以直接在Oracle官网下载JDK。 [rootlinux-node1 ~]# yum install -y java-1.8.0 安装Jekins [rootlinux-node1 ~]# cd /etc/yum.repos.d/ […

2019/2/18 Python今日收获

Python day15——032&#xff0c;033异常处理&#xff1a;你不可能总是对的 1. Python标准异常总结AssertionError断言语句&#xff08;assert&#xff09;失败AttributeError尝试访问未知的对象属性EOFError用户输入文件末尾标志EOF&#xff08;Ctrld&#xff09;FloatingPoin…