• 如何使用JMETER从JSON响应中提取数据


    如果你在这里,可能是因为你需要使用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 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 (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示例

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

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

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

  • 相关阅读:
    以下哪个Hibernate主键生成策略是实现主键按数值顺序递增的?
    编写一个Filter,除继承HttpServlet类外还需要( )。
    有关JSP隐式对象,以下( )描述正确。
    JAVA通信系列三:Netty入门总结
    JAVA通信系列二:mina入门总结
    JAVA通信系列一:Java Socket技术总结
    大型网站架构系列:缓存在分布式系统中的应用(三)
    大型网站架构系列:缓存在分布式系统中的应用(二)
    大型网站架构系列:缓存在分布式系统中的应用(一)
    大型网站架构系列:负载均衡详解(4)
  • 原文地址:https://www.cnblogs.com/a00ium/p/10386407.html
Copyright © 2020-2023  润新知