beanshell是什么
BeanShell是一个小型嵌入式Java源代码解释器,具有对象脚本语言特性,能够动态地执行标准JAVA语法,并利用在JavaScript和Perl中常见的的松散类型、命令、闭包等通用脚本来对其进行拓展。BeanShell不仅仅可以通过运行其内部的脚本来处理Java应用程序,还可以在运行过程中动态执行你java应用程序执行java代码。因为BeanShell是用java写的,运行在同一个虚拟机的应用程序,因此可以自由地引用对象脚本并返回结果。(摘抄自网络)
下载及运行
下载地址:https://beanshell.github.io/download.html
java -jar直接运行
测试
其它方式启动:先把jar包加入到环境变量
界面UI方式 :java bsh.Console
命令行方式 :java bsh.Interpreter
运行脚本文件:java bsh.Interpreter filename [args]
第一个例子
第二个例子
运行结果
如果jar包没加到环境变量,可以这样运行:java -classpath %CLASSPATH%;bsh-2.0b4.jar bsh.Interpreter test.txt
常用命令
print() 输出内容到命令行中
source()读一个bsh脚本到当前解释器(interpreter)中,或者在新的解释器中运行这个脚本
而我们的jmeter中,已经自带了jar包,下面介绍jmeter中如何使用beanshell
添加变量
引用变量
发送请求,可以看到密码加密了
自定义函数
上面也可以封装为函数
下面方法返回类型为void
import org.apache.commons.codec.digest.DigestUtils;
public static void fun(){
String password_md5 = DigestUtils.md5Hex("123456");
vars.put("password_md5", password_md5);
}
fun();
下面方法返回类型为String
import org.apache.commons.codec.digest.DigestUtils;
public static String fun(){
String password_md5 = DigestUtils.md5Hex("123456");
print(password_md5); // 在命令行窗口打印结果
return password_md5;
}
String password_md5 = fun();
vars.put("password_md5", password_md5);
也可以写成这样(方法不写返回类型)
import org.apache.commons.codec.digest.DigestUtils;
fun(){
String password_md5 = DigestUtils.md5Hex("123456");
print(password_md5); // 在命令行窗口打印结果
return password_md5;
}
String password_md5 = fun();
vars.put("password_md5", password_md5);
甚至写成这样(定义的变量也没类型)
import org.apache.commons.codec.digest.DigestUtils;
fun(){
String password_md5_res = DigestUtils.md5Hex("123456");
print(password_md5_res); // 在命令行窗口打印结果
return password_md5_res;
}
password_md5 = fun();
vars.put("password_md5", password_md5);
但是还是推荐按照java的方式写,严格定义。
引用java文件、class文件、jar文件
常用内置变量
JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互。
log
vars
prev
Failure
FailureMessage
具体用法请百度,本篇的示例中也有使用到。
beanshell组件
Jmeter中包括多种BeanShell,用法差不多,只是作用的地方不同。
定时器: BeanShell Timer
前置处理器:BeanShell PreProcessor,提前处理请求参数,如:加密解密等
采样器: BeanShell Sampler
后置处理器:BeanShell PostProcessor,在请求后对返回结果进行处理
断言: BeanShell断言,验证返回结果的正确性
监听器: BeanShell Listener
下面举例几个常用的。
beanshell采样器
引用变量
发送请求,可以看到密码加密了
beanshell前置处理器
beanshell断言
pom依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>
</dependencies>
代码及打的jar包
把jar包复制到jmeter的lib下ext中,重启jmeter
添加用户定义变量
请求
beanshell前置处理器,加密密码
beanshell断言
完整脚本
import com.uncleyong.JsonToJSONObject;
import com.alibaba.fastjson.JSONObject; // 不能少,下面定义了JSONObject类型
print("===========开始执行==========");
String exp_result = vars.get("exp_result");
print("exp_result= " + exp_result);
print("exp_result的类型:" + exp_result.getClass().toString()); // exp_result的类型:class java.lang.String
//Integer.valueOf返回的是Integer对象,Integer.parseInt返回的是int
Integer exp_result2 = Integer.valueOf(exp_result);
print("exp_result2的类型:" + exp_result2.getClass().toString()); // exp_result2的类型:class java.lang.Integer
String jsonString = prev.getResponseDataAsString();
print("获取到的返回结果:" + jsonString);
print("返回结果的类型:" + jsonString.getClass().toString()); // 返回结果的类型:class java.lang.String
JSONObject responseJson = new JsonToJSONObject().JSONObjectUtil(jsonString);
print("转换后的返回结果:" + responseJson);
print("转换后的返回结果类型:" + responseJson.getClass()); // 转换后的返回结果类型:class com.alibaba.fastjson.JSONObject
String code = responseJson.getString("code");
print("code = " + code);
print("code的类型:" + code.getClass()); // code的类型:class java.lang.String
Integer code2 = responseJson.getInteger("code");
print("code2 = " + code2);
print("code2的类型:" + code2.getClass()); // code2的类型:class java.lang.Integer
//if (code.equals(exp_result)==false) {
if (code2 != exp_result3) {
print("--------进入if语句--------");
Failure = true;
FailureMessage = "code与实际值不一致,期望值" + exp_result + ", 实际值" + code;
}
print("===========结束执行==========");
运行结果
手把手实践
《性能测试:jmeter中通过beanshell把关联转变成参数化》