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

好消息!您正在掌握掌握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 (click link to try) Result
$.store.book[*].author The authors of all books
$..author All authors
$.store.* All things, both books and bicycles
$.store..price The price of everything
$..book[0,1] The first two books
$..book[:2] All books from index 0 (inclusive) until index 2 (exclusive)
$..book[2:] Book number two from tail
$..book[?(@.isbn)] All books with an ISBN number
$.store.book[?(@.price < 10)] All books in store cheaper than 10
$..book[?(@.price <= $[‘expensive’])] All books in store that are not “expensive”
$..book[?(@.author =~ /.*REES/i)] All books matching regex (ignore case)
$..* Give me every thing
$..book.length() The number of books

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提取器来提取firstnamejson字段。

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

现在在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教程即将结束!可是等等?它尚未完成!

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

有几种方法可以使用JMeter从Json文档中提取数据。我们最喜欢的是内置的Json Extractor。

如何使用JMETER从JSON响应中提取数据的更多相关文章

  1. JMETER从JSON响应中提取数据

    如果你在这里,可能是因为你需要使用JMeter从Json响应中提取变量. 好消息!您正在掌握掌握JMeter Json Extractor的权威指南.作为Rest API测试指南的补充,您将学习掌握J ...

  2. [数据科学] 从text, json文件中提取数据

    文本文件是基本的文件类型,不管是csv, xls, json, 还是xml等等都可以按照文本文件的形式读取. #-*- coding: utf-8 -*- fpath = "data/tex ...

  3. 如何使用JMeter从文件中提取数据

    在性能测试方面,重用响应数据至关重要.几乎(如果不是全部!)负载测试场景假设您: 从先前的响应中提取有趣的方面,并在下一个请求中重用它们(也称为相关) 确保实际响应符合预期(又称断言) 因此,如果您是 ...

  4. 返回数据中提取数据的方法(JSON数据取其中某一个值的方法)

    返回数据中提取数据的方法 比如下面的案例是,取店铺名称 接口返回数据如下: {"Code":0,"Msg":"ok","Data& ...

  5. [数据科学] 从csv, xls文件中提取数据

    在python语言中,用丰富的函数库来从文件中提取数据,这篇博客讲解怎么从csv, xls文件中得到想要的数据. 点击下载数据文件http://seanlahman.com/files/databas ...

  6. Kettle实现从数据库中提取数据到Excel

    因为有个日常提数,工作日每天都要从数据库中提取数据,转换为excel,再以邮件的形式发给用户. 刚好近期同事在研究使用kettle自动提数且完成邮件的发送,觉得很实用又挺有意思的就学了一下这个技能~ ...

  7. 使用Python从PDF文件中提取数据

    前言 数据是数据科学中任何分析的关键,大多数分析中最常用的数据集类型是存储在逗号分隔值(csv)表中的干净数据.然而,由于可移植文档格式(pdf)文件是最常用的文件格式之一,因此每个数据科学家都应该了 ...

  8. 五、Jmeter中提取JSON响应中数组的长度

    json响应如下: { "code":0, "data":{ "data":[ { "amount":50000, &q ...

  9. Linux下利用json-c从一个json数组中提取每一个元素中的部分字段组成一个新json数组

    先把代码贴上来,有时间整理一下 首先说一下要实现的功能: 假定现在有一个json格式的字符串,而且他是一个josn中的数组,比如: [ { "id": "NEW20170 ...

随机推荐

  1. bzoj 3171: [Tjoi2013]循环格 最小费用最大流

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=3171 题解: 首先我们很容易发现一个结论: 出现完美循环当且仅当所有点的出入度均为1 所 ...

  2. HDOJ1272(并查集,判断是否为树)

    0 0 Yes 1 1 0 0 Yes 1 2 2 1 0 0 No //自回路不算一条边的! 居然有 0 0 这样的测试数据 #include<iostream> #include< ...

  3. C#中DataTable用法

    一.select方法1.筛选出男性且名字中带有李的人然后按照生日降序排列(1)DataRow[] rows=DataTable.Select("sex='"+"男&quo ...

  4. 报错之-Cannot set property 'onclick' of null

    当js文件放在head里面时,如果绑定了onclick或者onmouseover事件,就会出现如下图类似的错误,是因为浏览器的加载你写的html文档的顺序是从上往下,加载完按钮节点才执行的js,所以当 ...

  5. 优化Java堆大小的5个技巧

    本文作者Pierre是一名有10多年经验的高级系统架构师,他的主要专业领域是Java EE.中间件和JVM技术.根据他多年的工作实践经验,他发现许多性能问题都是由Java堆容量不足和调优引起的.下面他 ...

  6. IIS应用池保持激活工具开发

    之前的 开源一个定时任务调度器 webscheduler 中涉及的定时调用应用已经开始在正式环境中启用,发布到IIS下进行测试,发现一旦应用长时间没有访问(大约半个多小时)就会引发 Applicati ...

  7. HTTP 400 错误 编译器错误消息: CS0016

    问题:运行程序时提示http 400错误 解决方法: 去掉勾 尝试将网页发布到本地IIS上,发现出现以下错误: 编译器错误消息: CS0016 解决编译器错误消息: CS0016:方法如下: 一般都是 ...

  8. “box-shadow”属性(转)

    “box-shadow”属性 box-shadow属性是一个CSS3属性,允许我们在几乎任何元素上来创建阴影效果,类似于在设计软件中的”drop shadow”.这些阴影效果允许我们在原本平面的.二维 ...

  9. TCP的三次握手和四次挥手,为什么?

    首先,我们要知道TCP是全双工的,即客户端在给服务器端发送信息的同时,服务器端也可以给客户端发送信息.而半双工的意思是A可以给B发,B也可以给A发,但是A在给B发的时候,B不能给A发,即不同时,为半双 ...

  10. HTML基础:

    HTML是英文HyperText Markup Language的缩写,即超级文本标记语言,是用于描述网页文档的一种标记语言.HTMl是目前网络上应用最为广泛的语言,也是构成网页文档的主要语言.HTM ...