在做接口测试时,对响应数据的校验是非常重要的部分;在使用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();

jmeter BeanShell断言(三)数据处理的更多相关文章

  1. jmeter BeanShell断言(一)

    原文地址https://blog.csdn.net/lijing742180/article/details/81157947 原文地址https://blog.csdn.net/zailushang ...

  2. jmeter beanshell断言接口自动化实例

    一.JMeter介绍 Apache JMeter是一款优秀的开源性能测试工具,在国外无论是在性能测试还是接口测试领域都有着非常高的使用率,但由于本身没有完善的中文文档以及典型开源工具特点(界面不美观) ...

  3. Jmeter BeanShell断言

    这篇文章用来记录编写beanshell断言遇到得问题. 问题1:JSONObject not found in namespace 流程:在beanshell下写代码如下: 1 String resp ...

  4. (jmeter内置可调用的变量)jmeter beanShell断言

    用户可以在jmeter- “beanShell断言”中自定义断言.自由灵活的用脚本实现自己的断言  beanShell断言接口介绍  在beanShell中直接可以调用的变量,无需加前缀.  1.lo ...

  5. jmeter BeanShell断言(四)

    Bean Shell常用内置变量 JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下: log:写入信息到jmeber.log ...

  6. Jmeter beanshell断言 org.json.jar包下载

    链接:https://pan.baidu.com/s/1O01ODjlKyqmz2NyDT0MCww 提取码:a5va 欢迎关注微信公众号:软件测试汪,qq技术交流群:809111560

  7. jmeter之beanshell断言---数据处理

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

  8. jmeter BeanShell实例-----两个变量之间的断言对比

    jmeter BeanShell实例-----两个变量之间的断言对比 在jmeter的中,断言没法对两个变量的进行对比后判断,只能使用Bean Shell断言来进行,总是有人来问怎么写呢.这里写一个简 ...

  9. JMeter中BeanShell断言使用一

    Jmeter Ant Task如何让beanshell断言失败的详细信息展示在report里面 首先必须给beanshell断言添加FailureMessage if(${TotalClient_SS ...

随机推荐

  1. AppDir【创建缓存目录】【建议使用这个工具类】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 创建缓存目录 public static String APP_CACHE = "";// /storage/e ...

  2. MySQL Case--优化OR语句踩坑记录

    问题描述 研发同事反馈某应用执行较慢,对应SQL为: UPDATE bs_serial_trac , LOCK_VALUE = '', UPDATE_USER = 'transSys' ' AND ( ...

  3. Python并发编程-多进程

    Python并发编程-多进程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多进程相关概念 由于Python的GIL全局解释器锁存在,多线程未必是CPU密集型程序的好的选择. ...

  4. HTML&CSS基础-xHtml语法规范

    HTML&CSS基础-xHtml语法规范 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.html源码 <!DOCTYPE html> <html> ...

  5. jquery 属性筛选选择器

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content ...

  6. PAT甲级1009水题飘过

    题目分析:简单的多项式的模拟乘法,你可以假设未知数为x,exp为x的指数,coe为x的系数,则很容易就把答案推算出来,注意答案是从指数的高往低输出,同时要注意的是这是多项式的乘法,虽然指数的范围只有0 ...

  7. linux卸载及安装mysql 5.7以上

    删除: 1.rpm -qa|grep -i mysql     查看安装的mysql 2./usr/local/mysql/support-files/mysql.server stop  停止mys ...

  8. Djiango-建立模型抽象基类

    创建一个抽象模型基类 ‘ 然后 ’base_model.py from django.db import models from datetime import date class BaseMode ...

  9. volatile 错误示范做线程同步 demo

    这里 http://hedengcheng.com/?p=725 有对volatile 非常详细的解释,看完之后,心里一惊,因为我刚好在一个项目里用了文中错误示范那种方式来做线程同步,场景如下: Th ...

  10. Basic concepts of docker/kubernete/kata-container

    Kubereters An open-source system for automating deployment, scaling, and management of containerized ...