JMETER从JSON响应中提取数据

若是你在这里,多是由于你须要使用JMeterJson响应中提取变量css

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

咱们走吧!而且不要惊慌,那里没有什么困难前端

Json格式

为了更好地理解Json是什么,这是一个示例Json文档:java

{
    "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是一种很是简单的数据格式,几年前就已经接管了XMLreact

你可能会问本身:为何我须要学习Json?jquery

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

想知道最好的部分吗?angularjs

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

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

如今在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快几个级别

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教程即将结束!但是等等?它还没有完成!

您可能有兴趣查看咱们的其余指南

相关文章
相关标签/搜索