JMeter(5) JMeter之BeanShell使用
BeanShell介绍
BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性。本篇只记录一下基本的使用。有以下五个组件:
- Beanshell Sampler
- Beanshell PreProcessor
- Beanshell PostProcessor
- Beanshell Assertion
- __Beanshell Function
常用变量
- vars:实际引用jmeter线程的局部变量,连通jmeter和beanshell
vars.get(String key) //获取变量值
vars.put(String key, String value)//存储value到变量key - log: 写入信息到日志中,log.info("")
- prev: 获取前一个sample的响应
getResponseDataAsString()
getResponseCode() - props: class java.util.Properties
变量属性赋值给变量props.put("some_variable",vars.get("some_variable"))
Jmeter Log
Jmeter日志默认存放在%JMeter_HOME%\bin\JMeter.log, 脚本中使用log.info("日志")打印需要的日志信息
JMeter里面点击右上角可打开日志窗口
Jmeter使用Log4j日志组件输出日志,%JMETER_HOME%\bin\jmeter.properties\log_level.jmeter用于控制Jmeter日志记录级别。可以设置以下日志级别:FATAL_ERROR, ERROR, WARN, INFO,DEBUG,其中FATAL_ERROR打印日志最少,DEBUG级别日志最详细。
log_level.jmeter=INFO //INFO级别,只有等于及高于这个级别的才打印日志,如果配置为INFO只显示INFO, WARN, ERROR的log信息,而DEBUG信息不会被显示。jmeter可以为不同的模块设置不同的日志级别,如下:

Beanshell PreProcessor
预先处理,生成一段随机字符串并赋值给变量,同个线程组内通过${变量名}读取
import java.util.Random;
String random_len(int length) {
chars = "ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
int string_length = 8;
randomstring ="";
for (int i=0; i<string_length; i++) {
Random randomGenerator = new Random();
int randomInt = randomGenerator.nextInt(chars.length());
randomstring += chars.substring(randomInt,randomInt+1);
}
return randomstring;
}
log.info(random_len(8));
log.info(random_len(16));
vars.put("random_8", random_len(8));
vars.put("random_16", random_len(16));
Beanshell Assertion
断言结果字段是Failure=true/false; 运行结果需要打印出的信息写在FailureMessage = "XXXX";
eg1. 断言uid=预期的值
if(!"${uid}".equals("774170"))
{
Failure=true;
FailureMessage = "error, check";
}
else
{
FailureMessage = "ok!";
}
实例: 断言返回的数据类型
先把用到的jar包org.json放在jmeter/lib文件下,并在测试计划中导入

思路
function(standardData,respData){
standardJson =getJson();
respJson = getJson(respData);
循环N次{
if(standardJson.getType == respJson.getType); //逐个判断json的字段类型是否符合标准
}
Beanshell代码
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.Iterator;
import java.util.Map;
/**
* Created by Susie on 2016/8/25.
*/
public static String equalsJson(JSONObject standardJson, JSONObject responseJson) {//输入两个json,判断第一个里面的所有字段在第二个中的类型是否相同
String err_message = "";
Iterator it = standardJson.keys(); // 储存所有要验证的Key
while (it.hasNext()) {
String key = (String) it.next();
String thisKetType = standardJson.get(key).getClass().getName(); //获取当前Key的标准type
log.info("standard Key = " + key + ", Value = " + standardJson.get(key) + ", Type = " + thisKetType);
if(responseJson.isNull(key)){ //判断response中有无当前Key
log1 = "------ExistError: " + key + " Not found.";
log.info("!!Failed: " + log1);
err_message = (err_message + "\n" + log1);
}
else{ //response中找到Key了,再判断type
String respKetType = responseJson.get(key).getClass().getName(); //获取响应的字段类型
if(respKetType.equals(thisKetType)){
log.info("Passed.");
if(thisKetType.equals("org.json.JSONObject")){ //object类型的字段继续往内层判断
err_message += equalsJson(standardJson.getJSONObject(key), responseJson.getJSONObject(key)); //!!进入递归时,保存当前错误信息
}
} else {
String log1 = "------TypeError : " + key + " is " + respKetType + " (should be " + thisKetType + ")";
log.info("!!Failed: " + log1);
err_message = (err_message + "\n" + log1);
}
}
}
return err_message;
}
public static Boolean respTypeAssertion(String standardData) { //输入标准响应,转为json并调用比较函数,得到断言结果
String resData = prev.getResponseDataAsString(); //获取前一个请求的响应
log.info("res: " + resData);
JSONObject standardJson = new JSONObject(standardData);
JSONObject jo = new JSONObject(resData);
JSONObject responseJson = jo.getJSONObject("data");
log.info("------------------------Beanshell assertion7-------------");
String message = equalsJson(standardJson, responseJson);
log.info("------------------------ResultMessage--------------------" + message);
if(message == ""){ //如果错误信息是空,说明断言结果通过
FailureMessage = "Pass!";
return true;
}
else{ //有错误信息打印到断言结果里面
Failure=true;
FailureMessage = "Type Error!" + message;
}
return false;
}
//-----------------------------------------------
String standardData = "{'uid':'123','phone':'13580478329','has_password':true,'location':{'province':true,'city':'\u6c55\u5934\u5e02'},'cpma':null}";
respTypeAssertion(standardData);
运行,查看结果

参考链接
Jmeter接口文档:
https://jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html
Java数据类型:
http://webcache.googleusercontent.com/search?q=cache:SgdVfka7SZIJ:www.runoob.com/java/java-basic-datatypes.html+&cd=1&hl=zh-CN&ct=clnk&gl=ph
JMeter(5) JMeter之BeanShell使用的更多相关文章
- 【jmeter】JMeter中返回Json数据的处理方法
Json 作为一种数据交换格式在网络开发,特别是 Ajax 与 Restful 架构中应用的越来越广泛.而 Apache 的 JMeter 也是较受欢迎的压力测试工具之一,但是它本身没有提供对于 Js ...
- JMeter (3) —— JMeter录制脚本并压力测试用户登陆场景以CAS SSO为例(101 Tutorial)
JMeter (3) -- JMeter录制脚本并压力测试用户登陆场景以CAS SSO为例(101 Tutorial) 主要内容 JMeter录制脚本并进行压力测试用户登陆场景,并以CAS SSO单点 ...
- JMeter (2) —— JMeter与WebDriver测试用户登陆以CAS SSO为例(101 Tutorial)
JMeter (2) -- JMeter与WebDriver测试用户登陆以CAS SSO为例(101 Tutorial) 主要内容 JMeter与WebDriver测试用户登陆以CAS SSO为例 环 ...
- JMeter (1) —— JMeter与WebDriver安装与测试(101 Tutorial)
JMeter (1) -- JMeter与WebDriver安装与测试(101 Tutorial) 主要内容 JMeter安装 WebDriver安装 一个简单的JMeter+WebDriver示例 ...
- 【jmeter】 jmeter 测试HTTP接口
到apache官网下载jmeter:http://jmeter.apache.org/download_jmeter.cgi 1.运行 bin/jmeter.bat ,添加线程组 2.添加HTTP请求 ...
- 【jmeter】jmeter测试手机app的服务器压力
具体步骤: 1.电脑启动jmeter 2.jmeter在测试计划新建线程组. 3.在工作台新建http代理服务器 4.配置HTTP代理服务器 5.设置IE代理到本地 6.手机wifi设置代理连接到PC ...
- 【jmeter】jmeter环境搭建
一. 工具描述 apache jmeter是100%的java桌面应用程序,它被设计用来加载被测试软件功能特性.度量被测试软件的性能.设计jmeter的初衷是测试web应用,后来又扩充了其它的功能.j ...
- Jmeter 03 Jmeter脚本开发
JMeter 工作区介绍 JMeter Http 协议录制 JMeter 脚本调测 JMeter 关联 JMeter 参数化 JMeter 检查点 JMeter 事务 JMeter 集合点 JMete ...
- Jmeter 04 Jmeter变量的使用
在使用jmeter进行接口测试时,我们难免会遇到需要从上下文中获取测试数据的情况,这个时候就需要引入变量了. 定义变量 添加->配置元件->用户自定义的变量 添加->配置元件-> ...
随机推荐
- poj2965 The Pilots Brothers' refrigerator —— 技巧性
题目链接:http://poj.org/problem?id=2965 题解:自己想到的方法是枚举搜索,结果用bfs和dfs写都超时了.网上拿别人的代码试一下只是刚好不超时的,如果自己的代码在某些方面 ...
- cad定制快捷键
1.工具-自定义-编辑程序参数,改好之后,关闭. 2.在命令行输入:reinit-选择PGP文件-确定.
- 夏日户外风景PSD素材
夏日户外风景PSD素材适用于向日葵素材背景图设计 地址:http://www.huiyi8.com/xiangrikui/
- ThinkPHP基础(1)
多层MVC模式 M:Model 数据模型层,负责数据操作 V:View 视图层,负责显示视图 C:Controller 控制器,实现业务逻辑 控制器访问及路由解析 通过url地址get参数找到指定的控 ...
- linux ssh 命令使用解析
前一阵远程维护Linux服务器,使用的是SSH,传说中的secure shell. 登陆:ssh [hostname] -u user 输入密码:***** 登 陆以后就可以像控制自己的机器一样控制它 ...
- CodeForces - 660F:Bear and Bowling 4(DP+斜率优化)
Limak is an old brown bear. He often goes bowling with his friends. Today he feels really good and t ...
- 「LuoguP3389」【模板】高斯消元法
题目背景 Gauss消元 题目描述 给定一个线性方程组,对其求解 输入输出格式 输入格式: 第一行,一个正整数 nn 第二至 n+1n+1行,每行 n+1n+1 个整数,为a_1, a_2 \cdot ...
- uC/OS-II源码分析(六)
μC/OS-Ⅱ总是运行进入就绪态任务中优先级最高的那一个.确定哪个任务优先级最高, 下面该哪个任务运行了的工作是由调度器(Scheduler)完成的.任务级的调度是由函数 OSSched()完成的.中 ...
- ubuntu 18.04 设置中文输入法
有下面几种常用选择: IBus拼音:sudo apt-get install ibus-pinyin IBUS五笔:sudo apt-get install ibus-table-wubi 谷歌拼音输 ...
- HDOJ-2153
仙人球的残影 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

