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 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路径提取。
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示例
我们的示例JMX展示了JMeter Json Extractor和Plugin JsonPath Extractor的工作原理。在JMeter 3.0之前,需要插件执行JsonPath提取。从JMeter 3.0开始,Json Extractions得到了集成支持。
准备采取一些行动?我们走吧!
阵列提取
从商店中提取所有作者
提取数组可以一次从单个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
我们得到了所有书籍的所有作者!
条件提取
有选择地提取书籍标题
现在假设我们想要提取价格小于或等于10的书籍的标题:
- 变量名称:
titles
产生${titles}
变量, - 比赛号码:
-1
, - JSONPath表达式 :(
$.store.book[?(@.price<= 10)].title
图书标题的价格<= 10)。
您将获得以下变量:
titles_1=Sayings of the Century
titles_2=Moby Dick
titles_matchNr=2
价格低于10的书籍。
多次提取
提取书籍作者和标题
现在假设我们想要同时提取多个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 UI中显示的结果。
连接提取
有时,您希望将所有结果提取并连接成单个字符串。在这个例子中,我采用了HTTPBin头 json端点。
这可以使用该Compute Concatenation var (suffi _ALL)
选项实现。
从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:选中。
现在让我们看看结果。
提取所有结果的串联
最后,让我们使用Debug Sampler来查看正在提取的变量(foo
在此处命名)。
调试结果
结果应该是这样的:
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 Dummy Sampler插件
对于此示例,我们将使用Dummy Sampler插件。为什么?因为它允许使用我们想要的任何json生成样本结果。
让我们使用以下Json:
{
"firstname": "John",
"lastname": "Smith"
}
我们只是将配置虚拟采样器以将此Json作为响应发送。
JMeter Dummy Sampler插件配置
然后,我们创建一个Json提取器来提取firstname
json字段。
JMeter Json Extractor
现在让我们配置一个响应断言。
响应断言必须位于之后的JSON提取才能工作。
使用Response Assertion验证变量值
的响应断言被配置如下:
- 应用于:要使用的JMeter变量名称,
- 要测试的字段:文本响应,
- 模式匹配规则:等于,
- 要测试的模式:
John
在我们的示例中。
是时候执行线程组并查看结果了。
断言成功通过
如果我们替换断言模式来测试titi
。
断言失败了
大!现在您知道如何从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"}
]
}
在这种情况下,正则表达式提取器可能很适合,因为编写正则表达式非常简单。
我们定义了以下设置:
- 参考名称:
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.JsonSlurper
def 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快几个级别。
配置与JSR223非常相似。这里我们有最终变量${firstname_BSH}
。
JMeter插件(Json Path Extractor)
从JMeter 3.0开始,JMeter Json Extractor插件应该被放弃,以支持内置的Json Path提取器。如果您使用的是JMeter, 此插件仍然有用<= 2.13
。
用例
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:使用正则表达式来提取部分响应。
JMETER从JSON响应中提取数据的更多相关文章
- 如何使用JMETER从JSON响应中提取数据
如果你在这里,可能是因为你需要使用JMeter从Json响应中提取变量. 好消息!您正在掌握掌握JMeter Json Extractor的权威指南.作为Rest API测试指南的补充,您将学习掌握J ...
- [数据科学] 从text, json文件中提取数据
文本文件是基本的文件类型,不管是csv, xls, json, 还是xml等等都可以按照文本文件的形式读取. #-*- coding: utf-8 -*- fpath = "data/tex ...
- 如何使用JMeter从文件中提取数据
在性能测试方面,重用响应数据至关重要.几乎(如果不是全部!)负载测试场景假设您: 从先前的响应中提取有趣的方面,并在下一个请求中重用它们(也称为相关) 确保实际响应符合预期(又称断言) 因此,如果您是 ...
- 返回数据中提取数据的方法(JSON数据取其中某一个值的方法)
返回数据中提取数据的方法 比如下面的案例是,取店铺名称 接口返回数据如下: {"Code":0,"Msg":"ok","Data& ...
- [数据科学] 从csv, xls文件中提取数据
在python语言中,用丰富的函数库来从文件中提取数据,这篇博客讲解怎么从csv, xls文件中得到想要的数据. 点击下载数据文件http://seanlahman.com/files/databas ...
- Kettle实现从数据库中提取数据到Excel
因为有个日常提数,工作日每天都要从数据库中提取数据,转换为excel,再以邮件的形式发给用户. 刚好近期同事在研究使用kettle自动提数且完成邮件的发送,觉得很实用又挺有意思的就学了一下这个技能~ ...
- 使用Python从PDF文件中提取数据
前言 数据是数据科学中任何分析的关键,大多数分析中最常用的数据集类型是存储在逗号分隔值(csv)表中的干净数据.然而,由于可移植文档格式(pdf)文件是最常用的文件格式之一,因此每个数据科学家都应该了 ...
- 五、Jmeter中提取JSON响应中数组的长度
json响应如下: { "code":0, "data":{ "data":[ { "amount":50000, &q ...
- 如何使用Hive&R从Hadoop集群中提取数据进行分析
一个简单的例子! 环境:CentOS6.5 Hadoop集群.Hive.R.RHive,具体安装及调试方法见博客内文档. 1.分析题目 --有一个用户数据样本(表名huserinfo)10万数据左右: ...
随机推荐
- Java IO 简记
1.File 类: l java.io.File类:文件和目录路径名的抽象表示形式,与平台无关 l File 能新建.删除.重命名文件和目录,但 File 不能访问文件内容本身.如果需要访问文件内 ...
- Java读取文件的时候,如何让指针重新回到文件的开头
今天在测试IO流的使用的时候发现在reader读取文件之后,再向文件添加内容,再继续读文件,打印出的结果只能读取追加的文件. 如何才能重新读取呢?试了mark和reset,似乎会报异常.记在这以后看是 ...
- 3.3 CCSprite 精灵详解
3.3.1 创建精灵常用的 4 种方式 (当然还有其他方式,只不过 这四种比较常用) //创建精灵常用的 4 种方式 CCSprite* spr1 = CCSprite::create(const c ...
- [基本操作]线段树分治和动态dp
不知道为什么要把这两个没什么关系的算法放到一起写...可能是都很黑科技? 1.线段树分治 例题:bzoj4026 二分图 给你一个图,资瓷加一条边,删一条边,询问当前图是不是二分图 如果用 LCT 的 ...
- Codeforces Round #402 (Div. 2) 题解
Problem A: 题目大意: 给定两个数列\(a,b\),一次操作可以交换分别\(a,b\)数列中的任意一对数.求最少的交换次数使得任意一个数都在两个序列中出现相同的次数. (\(1 \leq a ...
- 【LeetCode】012. Integer to Roman
Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 t ...
- Error Domain=NSURLErrorDomain Code=-1202,Https服务器证书无效
错误:“此服务器的证书无效.您可能正在连接到一个伪装成“www.xxxxxx.com”的服务器, 这会威胁到您的机密信息的安全 原因:安全证书是自建证书,没有得到认证. 解决方法: 1.导入NSURL ...
- bzoj 2597 剪刀石头布 —— 拆边费用流
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2597 不合法的三个人之间的关系就是一个人赢了两次: 记 \( deg[i] \) 表示第 \ ...
- 我的日志app企划书1.0版本
因为个人的工作习惯,想要做一个app,是关于工作(生活)日志的. 目前有几个预想的功能吧. 1.按天展示自己的每日安排. 2.每到周末展示自己的周末安排. 1的需要: 是由于,每天总有那么一点两点的细 ...
- Poj_1004_FinancialManagement
一.Description Larry graduated this year and finally has a job. He's making a lot of money, but someh ...