发布新日志

  • jmeter ---json几种读取方式,ArrayList循环读取

    2018-01-14 17:39:06

    https://www.cnblogs.com/nzg-noway/p/7490412.html


    在之前写过提取json数据格式的文章,这次对jmeter读取json数据格式进行整理。

      举例一个接口的response 格式如下:

    复制代码
    {
       "data" : {
          "device_vec" : [
             {
                "agent_version" : "9.7.0.2225",
                "android_id" : "e3d699cf01620531",
                "asset_number" : "",
                "description" : "89vUwdwfVydEjqNAANxM11c72ujdmn",
                "device_name" : "357568061882002",
                "email" : "1504487508089@tt.com",
                "encryption_log_count" : 0,
                "encryption_version" : "",
                "engine_version" : "9.715-1024",
                "firewall_log_count" : 0,
                "firewall_version" : "",
                "group_id" : "aa000000-0000-0000-0000-000000000000",
                "group_name" : "Default",
                "id" : "35756806-1882-0020-0000-000000000000",
                "imei" : "357568061882002",
                "inactive_reason" : 0,
                "install_time" : 1503642124,
                "last_connected_time" : 1504742375,
                "last_scan_time" : 1503642674,
                "meid" : "",
                "noncomp_reason" : "",
                "os_version" : "4.3",
                "pattern_version" : "2.437.00",
                "phone_number" : "",
                "platform_type" : 512,
                "policy_id" : 32,
                "policy_name" : "",
                "security_status" : 3,
                "status" : 3,
                "user_name" : "test1504487508089",
                "virus_log_count" : 26,
                "wtp_log_count" : 0
             },
             {
                "agent_version" : "2.0.0.1518",
                "android_id" : "",
                "asset_number" : "",
                "description" : "3dLAbTlj7UQoOiodnAjDrfX1iI0PCx",
                "device_name" : "Michael’s iPhone",
                "email" : "1504487508089@tt.com",
                "encryption_log_count" : 0,
                "encryption_version" : "",
                "engine_version" : "",
                "firewall_log_count" : 0,
                "firewall_version" : "",
                "group_id" : "aa000000-0000-0000-0000-000000000000",
                "group_name" : "Default",
                "id" : "6954500b4f14e50bd20634481ee2c6d9f17b4ee3",
                "imei" : "35 445006 267069 9",
                "inactive_reason" : 0,
                "install_time" : 1503641446,
                "last_connected_time" : 1503652862,
                "last_scan_time" : 1503641477,
                "meid" : "35445006267069",
                "noncomp_reason" : "",
                "os_version" : "10.3.2",
                "pattern_version" : "",
                "phone_number" : "",
                "platform_type" : 1024,
                "policy_id" : 6,
                "policy_name" : "",
                "security_status" : 1,
                "status" : 3,
                "user_name" : "test1504487508089",
                "virus_log_count" : 0,
                "wtp_log_count" : 0
             }
          ],
          "total_count" : 2
       },
       "error_code" : 1,
       "message" : "Success",
       "timestamp" : 1504765848
    }
    复制代码

     

    下面就对device_vec取角标2的agent_version 参数进行提取。

     

    方法一:Jmter Json插件,JSON Path Extractor 提取器。

    处理Json数据的方法是使用JMeter的插件,该插件可以使用JSONPath来获取JSON数据中特定位置的数据。类似于XML文件中的XPath,JSONPath可以使用简单的表达式来操作Json对象。JSON Path Extractor是一个开源的增加了post处理器的插件,可以将该插件的Lib文件拷贝到JMeter的lib目录下或者通过Jmeter UI界面的Options-->Plugins Manager下载json插件即可。

    可以使用如下的JSONPath进行描述:

    $.data.device_vec[1].agent_version

    在JMeter中,只需要从PostProcessor菜单中打开JSON Path Extractor然后输入变量名与默认值即可,如下所示:

    JSONPath表达式较短并且易于阅读,能够有效提高测试脚本的易维护性,该插件并不随着标准的JMeter一起安装。

     

    方法二:Jmter 正则表达式插件正则表达式提取

    JMeter安装了正则表达式插件之后,可以按照固定的格式从字符串中提取数据,而本例中正则表达式如下所示:

    "agent_version":"(.+?)"

    使用了该表达式之后会返回所有服从表达式的字符串,但是只有一个表达式是我们所关注的。可以使用1个组作为模板($1$),而2则会返回第二个数据。

     

     

     方法三:Jmter BeanShell提取器, BeanShell提取器

    借用了JMeter的对于BeanShell支持的特性,BeanShell是一个轻量级的面向Java的脚本语言。BeanShell Post Processor允许使用标准的Java语法来处理Json数据,使用方法如下图所示:

       1.写一个jsonpath读取代码如下:

    复制代码
    import java.util.LinkedHashMap;
    import com.jayway.jsonpath.JsonPath;
    import com.jayway.jsonpath.Predicate;
    import net.minidev.json.JSONArray;
    public static String readjson(String json, String jsonPath) {
        try{
            Object value = JsonPath.read(json, jsonPath, new Predicate[0]);
            if (value instanceof Integer) {
                    return value.toString();
                      }else if (value instanceof String) {
                     return value.toString();
             }else if (value instanceof Boolean){
                     return value.toString();
             }else if (value instanceof JSONArray) {
                JSONArray arr = (JSONArray)value;
                if(!arr.isEmpty()){return arr.toJSONString();}
                      return "";
                }else if (value instanceof LinkedHashMap){
                        return value.toString();
                  }else{
                        return  value.toString();
                      }
        }catch(Exception e){
            return "pathnotfound";
        }
    }
    复制代码

    然后使用此方法来读取json数据格式

     

    2.导入com.eclipsesource.json 方法直接读取json

    com.eclipsesource.json,源码下载路径如下 https://github.com/ralfstx/minimal-json,只需将源码打成jar包放到jmeter的lib/ext目录下即可

    com.eclipsesource.json 适用方法:http://static.javadoc.io/com.eclipsesource.minimal-json/minimal-json/0.9.3/com/eclipsesource/json/JsonObject.html

     

    3.如果是循环读取,那就要算出List的长度做循环---用jsonpath读取方式去循环取(前面的jsonpath方法不再贴)

     

    4.如果是循环读取,那就要算出List的长度做循环---用com.eclipsesource.json api 读取方式循环读

    如下:

     

     

     

    总结

    本文列举出了三种可用的从Json格式的返回值中提取数据的方法,正则表达式对于简单的Json格式的数据的快速标准化非常占优势。而JsonPath插件可以用于创建能够被维护修改的脚本,但是需要额外的插件安装工作。而最后的带JSON库的BeanShell确实非常详细并且依赖于Java语言的灵活性可以进行进一步的开发。


  • Jmeter对Json格式数据的三种处理方式

    2018-01-14 17:38:06


    https://www.jianshu.com/p/fe5b0d70b1b3

    Json 作为一种数据交换格式在网络开发,特别是 RESTful(Representational State Transfer)架构中应用得越来越广泛。Jmeter是一款很适合做接口和性能的测试工具,对于下面这一段Json 格式的响应报文我们可以在jmeter里面使用三种不同的方法来进行数据的抽取工作。

    {
    :   "code":"000000",
    :   "data":
    :   {
    :   :   "pageCount":"1",
    :   :   "prizeLists":
    :   :   [
    :   :   :   {
    :   :   :   :   "cellphoneNum":"134****0001",
    :   :   :   :   "prizeId":"1000005",
    :   :   :   :   "prizeName":"10元话费"
    :   :   :   },
    :   :   :   {
    :   :   :   :   "cellphoneNum":"134****0001",
    :   :   :   :   "prizeId":"1000007",
    :   :   :   :   "prizeName":"4元话费"
    :   :   :   }
    :   :   ],
    :   :   "totalCount":"2"
    :   },
    :   "msg":"成功"
    }
    

    1)使用正则表达式提取prizeName的第二个值
    在Sampler上面添加后置处理器-->正则表达式提取器,


    引用名称:其他地方引用提取值的变量名称,这里填写的是:prizeNameValue,具体的引用方式是${prizeNameValue}。
    正则表达式:提取内容的正则表达式【()表示提取,对于你要提前的内容需要用小括号括起来】。
    模板:用$$引用起来,如果在正则表达式中有多个提取表达式(多个括号括起来的部分),则可以是$1$,$2$等等,表示解析到的第几个值给prizeNameValue,正则表达式的提取模式,值从1开始,值0对应的是整个匹配的表达式。
    匹配数字(0代表随机):0代表随机,-1代表所有,其余正整数代表将在已提取的内容中第几个匹配的内容。这里需要提取的是第二个匹配的值。
    缺省值:正则匹配失败时取的值。
    可以在jmeter中添加Sampler -->Debug Sampler来看正则表达式的取值。


    从上图中可以看出提取到的prizeNameValue的值是4元话费。
    2)使用 JMeter 的插件JSONPath 来获取 JSON 数据中特定位置的数据
    在jmeter的plugins网站http://jmeter-plugins.org/downloads/all/ 选择 JMeterPlugins-ExtrasLibs-X.X.X.zip下载,解压以后将lib和lib/ext中的jar包放到jmeter安装目录对应位置,然后重启jmeter。
    在Sampler上面添加后置处理器-->jp@gc - JSON Path Extractor,


    在DebugSampler的结果中可以看到prizeNameJson的取值是4元话费。

    3)使用JMeter的BeanShell Post Processor来处理Json数据
    将fastjson.jar 拷贝到 jmeter lib 文件夹下后重启 jmeter
    在Sampler上面添加后置处理器-->BeanShell PostProcessor

    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    
    String json=prev.getResponseDataAsString();
    JSONObject jso = JSON.parseObject(json);
    JSONObject data = jso.getJSONObject("data");
    JSONArray prizeLists = data.getJSONArray("prizeLists");
    
    vars.put("prizeNameValue",prizeLists.getJSONObject(1).getString("prizeName"));
    

    在DebugSampler的结果中可以看到prizeNameValue的取值是4元话费。


    总结
      本文列举出了三种可用的从 Json 格式的返回值中提取数据的方法。正则表达式对于简单的 Json 格式数据的处理非常快速标准化,JsonPath 插件可以创建能够被维护的脚本,引入fastjson库的BeanShell 依赖于 Java 语言的灵活性可以进行进一步的开发。大家可以根据自己的习惯和喜好选择任意一种进行数据的提取。



    作者:道韫
    链接:https://www.jianshu.com/p/fe5b0d70b1b3
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Open Toolbar