zoukankan      html  css  js  c++  java
  • jmeter BeanShell断言(三)数据处理

    在做接口测试时,对响应数据的校验是非常重要的部分;在使用Jmeter进行接口测试时,有多种respone校验方式,比如响应断言、BeanShell断言等等,BeanShell断言可以自定义断言,自由灵活的用脚本实现断言

    什么是BeanShell ?

    小型嵌入式Java源代码解释器,具有对象脚本语言特性,能够动态地执行标准JAVA语法 
    运行其内部的脚本处理Java应用程序,还可以在运行过程中动态执行你java应用程序执行java代码,因为BeanShell是用java写的,运行在同一个虚拟机的应用程序,因此可以自由地引用对象脚本并返回结果。

    Bean Shell常用内置变量

       JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下:

    log:写入信息到jmeber.log文件,使用方法:log.info(“This is log info!”);

    ctx:该变量引用了当前线程的上下文,使用方法可参考:org.apache.jmeter.threads.JMeterContext。

    vars - (JMeterVariables):操作jmeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁,常用方法:

        a) vars.get(String key):从jmeter中获得变量值

        b) vars.put(String key,String value):数据存到jmeter变量中

        更多方法可参考:org.apache.jmeter.threads.JMeterVariables

    props - (JMeterProperties - class java.util.Properties):操作jmeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。对应于java.util.Properties。

        a) props.get("START.HMS");  注:START.HMS为属性名,在文件jmeter.properties中定义

        b) props.put("PROP1","1234");

    prev - (SampleResult):获取前面的sample返回的信息,常用方法:

        a) getResponseDataAsString():获取响应信息

        b) getResponseCode() :获取响应code

        更多方法可参考:org.apache.jmeter.samplers.SampleResult

    sampler - (Sampler):gives access to the current sampler

    下面来介绍如何使用beanshell来进行断言和数据处理

    假如我们有如下的response数据:

    {
        "message": "不能发送小于当前时间点的定时任务",
        "statusCode": 200
    }

    (1)我们使用JSONObject对象来获取json数据首先需要下载org.json的jar包,然后在测试计划中导入该jar包,并在jmeter的lib目录下放入该jar包,下面验证statusCode的值是否等于200:

    import org.json.*;
    
    //获取上一个请求的返回
    String jsonString = prev.getResponseDataAsString();
    JSONObject responseJson = new JSONObject(jsonString);
    
    //判断返回值是否和预期一致
    if (responseJson.getInt("statusCode") != 200) {
        //把断言失败置为真,即用例失败,并在结果树中显示FailureMessage
        Failure = true;
        FailureMessage = "statusCode的返回值有误";
    }

    (2)如果要验证 respone 中 message 的值是否与预期一致,需要怎么做呢?

    import org.json.*;
    
    //获取上一个请求的返回
    String jsonString = prev.getResponseDataAsString();
    JSONObject responseJson = new JSONObject(jsonString);
    
    String fbpcontent = responseJson.getString("message");
    if (!fbpcontent.equals("不能发送小于当前时间点的定时任务")) {
        //把断言失败置为真,即用例失败,并在结果树中显示FailureMessage
        Failure = true;
        FailureMessage = "message与实际值不一致";
    }

    假如我们有如下的response响应数据:

    {
        "statusCode": 200,
        "data": [
            {
                "i": "50356",
                "n": "项目一",
                "v": "2.0",
                "iconUrl": "",
            },
            {
                "i": "45280",
                "n": "项目二",
                "v": "3.0",
                "iconUrl": "",
            },
            {
                "i": "14656",
                "n": "项目三",
                "v": "2.6",
                "iconUrl": "",
            },
            {
                "i": "66213",
                "n": "项目四",
                "v": "5.0",
                "iconUrl": "",
            }
        ]
    }

    (3)我们需要解析数组data的值,如何去解析呢?

    import org.json.*;
    import java.util.Arrays;
    
    //获取上一个请求的返回
    String jsonContent = prev.getResponseDataAsString();  
    
    JSONObject response = new JSONObject(jsonContent);  
    JSONArray groups = response.getJSONArray("data");  
    String strData= groups.toString(); 
    log.info(strData)

    现在有更加复杂格式的respone数据:

    {  
      "priorityGroups": {  
        "proId": 1234,  
        "name": "项目一",  
        "groups": [  
          {  
            "id": "50356",  
            "items": [  
              {  
                "proId": 1360,  
                "n": "PC端",  
                "index": 1  
              },  
              {  
                "proId": 1361,  
                "n": "iOS端",  
                "index": 2  
              },  
              {  
                "proId": 1362,  
                "n": "安卓端",  
                "index": 4  
              }  
            ]  
          }  
        ]  
      },  
      "promotion": {  
        "proId": 1364,  
        "cusId": 84,  
        "name": "项目二",  
        "from": 1470821215,  
        "to": 1470907615,   
        "status": 1,  
        "objectId": 1069,  
        "createBy": 394,  
        "eff": 1470821215000,  
        "createTime": 1470821155000  
      }  
    }

    (4)我们需要解析groups中的数据,需要怎么实现呢?

    import org.json.JSONArray;  
    import org.json.JSONException;  
    import org.json.JSONObject;  
    
    String jsonContent = prev.getResponseDataAsString();  
    
    JSONObject response = new JSONObject(jsonContent);  
    JSONArray groups = response.getJSONObject("priorityGroups").getJSONArray("groups");  
    String strGroups = groups.toString();
  • 相关阅读:
    堆和栈的区别
    .net中类(class)与结构(struct)的不同
    CTS、CLS、CLR
    C#和.Net的关系
    装箱(boxing)和拆箱(unboxing)
    三层架构
    属性和public字段的区别(调用set方法为一个属性设值,然后用get方法读取出来的值一定是set进去的值吗?)
    override与重载(overload)的区别
    C#中的委托是什么?事件是不是一种委托?事件和委托的关系。
    json转树状菜单栏
  • 原文地址:https://www.cnblogs.com/111testing/p/11219953.html
Copyright © 2011-2022 走看看