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进行接口测试时,我们难免会遇到需要从上下文中获取测试数据的情况,这个时候就需要引入变量了. 定义变量 添加->配置元件->用户自定义的变量 添加->配置元件-> ...
随机推荐
- poj 3268 Silver Cow Party (最短路算法的变换使用 【有向图的最短路应用】 )
Silver Cow Party Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13611 Accepted: 6138 ...
- jQuery Validate 插件为表单提供了强大的验证功能
之前项目开发中,表单校验用的jQuery Validate 插件,这个插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的 ...
- BZOJ-3881:Divljak (AC自动机+DFS序+树链求并+树状数组)
Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. “2 x” ...
- vue实现图片的上传和删除
目录 1 UI库使用ElementUI 2 后端使用Express + formidable模块 1 UI库使用ElementUI 安装ElementUI $ npm install --save-d ...
- 洛谷 P4721 [模板]分治FFT —— 分治FFT / 多项式求逆
题目:https://www.luogu.org/problemnew/show/P4721 分治做法,考虑左边对右边的贡献即可: 注意最大用到的 a 的项也不过是 a[r-l] ,所以 NTT 可以 ...
- python接口测试,第三方包xlrd和xlutils,怎么安装
第1个:xlrd的下载地址:https://pypi.python.org/pypi/xlrd/0.9.2 安装过程:下载后解压文件夹,使用cd命令行进入该文件夹后,用命令:python setup. ...
- selenium2获取input输入框中的值的三种方法。
- [codeforces161D]Distance in Tree(点分治/树形dp)
题意:求树上距离为k的点对个数: 解题关键:练习一下点分治不用容斥 而直接做的做法.注意先查询,后更新. 不过这个方法有个缺陷,每次以一个新节点为根,必须memset mp数组,或许使用map会好些, ...
- VMware10中安装centos7没有可用的网络设备
1.问题描述 centos7安装到虚拟机无法上网 2.安装环境 win7 x64 WM 10.01 iso CentOS-7-x86_64-DVD-1503-01.iso {4.01G} ...
- day6 面向对象(2)
static关键字 1:如果没有static会怎样? 1:定义Person类 1:姓名.年龄.国籍,说话行为 2:多个构造,重载形式体现 2:中国人的国籍都是确定的 1:国籍可以进行显示初始化 cla ...

