若是你在这里,多是由于你须要使用JMeter从Json响应中提取变量。css
好消息!您正在掌握掌握JMeter Json Extractor的权威指南。做为Rest API测试指南的补充,您将学习掌握Json Path Expressions 所需的一切。html
咱们走吧!而且不要惊慌,那里没有什么困难。前端
为了更好地理解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是一种很是简单的数据格式,几年前就已经接管了XML。react
你可能会问本身:为何我须要学习Json?jquery
愈来愈多的REST API和服务器使用Json做为主要的数据交换格式。在OctoPerf,咱们大量使用Json在AngularJS前端客户端和Spring Boot后端之间交换数据。git
想知道最好的部分吗?angularjs
从JMeter 3.0开始,使用Json变量提取器从Json响应中提取数据要容易得多。换句话说,Json提取器能够原生使用。github
JMeter JsonPath Extractor插件能够从jmeter-plugins网站下载和安装。从JMeter 3.0及更高版本开始,Json插件是可选的。正则表达式
安装JMeter JsonPath插件
JMETER_HOME/lib/ext
目录,Options > Plugins Manager
顶部菜单,Available Plugins
标签,Json Plugins
并单击Apply Changes并从新启动JMeter。在JMeter的Json的插件应该在右键菜单Add > Post Processors > Json Path Extractor
。顺便说一句,咱们建议您阅读咱们的JMeter插件安装指南,了解有关JMeter插件的更多详细信息。
你懒吗?由于我是。让咱们使用原生的JsonPath Extractor!
JMeter的Json Post处理器使用Json Way,一种Java Json Path API,在服务器响应上执行JSon路径提取。
Json Path提取器应放在HTTP Sampler下。它有几种可能的设置,所以最相关的是:
-1
对于全部,0
对于随机的,n
对于第n个,${foo_ALL}
包含全部提取值的串联的变量,真棒!可是我该如何开始?
如下是一些示例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探索上面的一些例子。
你猜怎么着?咱们打算试一试。
咱们的示例JMX展现了JMeter Json Extractor和Plugin JsonPath Extractor的工做原理。在JMeter 3.0以前,须要插件执行JsonPath提取。从JMeter 3.0开始,Json Extractions获得了集成支持。
准备采起一些行动?咱们走吧!
从商店中提取全部做者
提取数组能够一次从单个Json文档中提取多个值。例如,咱们能够从书店中提取全部做者:
authors
产生变量${authors}
,$..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
,$.store.book[?(@.price<= 10)].title
图书标题的价格<= 10)。您将得到如下变量:
titles_1=Sayings of the Century titles_2=Moby Dick titles_matchNr=2
价格低于10的书籍。
提取书籍做者和标题
如今假设咱们想要同时提取多个Json字段。例如,咱们想查询全部做者和标题:
multiple
,-1
,$..['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}
),$.headers.*
,-1
这意味着提取全部出现的,如今让咱们看看结果。
提取全部结果的串联
最后,让咱们使用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验证变量值
的响应断言被配置以下:
John
在咱们的示例中。是时候执行线程组并查看结果了。
断言成功经过
若是咱们替换断言模式来测试titi
。
断言失败了
大!如今您知道如何从json响应中提取变量并使用Response Assertion验证变量值。
如今,你可能想知道:什么可能出错?
应该避免的3个常见错误是:
根据具体状况,您可使用其余技术从服务器响应中提取内容。
假设您有一个很是简单的Json文档,其中包含如下内容,而且您须要全部名字:
{
"name":"Simpsons family", "members":[ {"firstName":"Homer", "lastName":"Simpson"}, {"firstName":"Marge", "lastName":"Simpson"}, {"firstName":"Bart", "lastName":"Simpson"} ] }
在这种状况下,正则表达式提取器可能很适合,由于编写正则表达式很是简单。
咱们定义了如下设置:
firstname_RegEx
,"firstName":"(.+?)"
,$1$
,3
,(咱们想要Bart)D'oh!
。经过使用Minimal Json库并将其添加到JMeter,您也能够从服务器响应中提取json数据。
使用外部Lib配置JMeter
<JMeter Home>/lib/ext
,如今在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 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后处理器能够得到相同的结果,但出于性能缘由,咱们不建议这样作。应该使用JSR223后处理器来支持BeanShell后处理器。使用Groovy的JSR223比BeanShell快几个级别。
配置与JSR223很是类似。这里咱们有最终变量${firstname_BSH}
。
从JMeter 3.0开始,JMeter Json Extractor插件应该被放弃,以支持内置的Json Path提取器。若是您使用的是JMeter, 此插件仍然有用<= 2.13
。
Json提取器在如下状况下特别有用:
这个巨大的Json教程即将结束!但是等等?它还没有完成!
您可能有兴趣查看咱们的其余指南: