在jmeter中怎么提取数据_如何使用JMETER从JSON响应中提取数据

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

好消息!您正在掌握掌握JMeter Json Extractor的权威指南

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

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

The authors of all books

All authors

All things, both books and bicycles

The price of everything

The first two books

All books from index 0 (inclusive) until index 2 (exclusive)

Book number two from tail

All books with an ISBN number

All books in store cheaper than 10

All books in store that are not “expensive”

All books matching regex (ignore case)

Give me every thing

The number of books

如您所见,从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

把它放进去/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教程即将结束!可是等等?它尚未完成!

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值