官网:http://www.BeanShell.org/html
jmeter中,Beanshell使用与java请求的区别?java
要根据本身的使用场景来选择适合本身的自定义脚本的方式。算法
BeanShell脚本编写相似于Java脚本。它能够获取、修改系统定义或用户定义的变量值,同时也能够进行一些相应的测试数据处理工做(例如:前置处理器、后置处理器及响应断言中均存在响应的BeanShell应用)。shell
使用建议 BeanShell是JMeter内置的功能,可是因为它是脚本语言,动态加载执行的,所以效率不是很高,不太适合于在常常执行的场景下,好比将BeanShell放在循环内部,不断地被执行。比较适合的应用场景是放在执行一次、或者少数几回的地方,好比在循环外部读取配置文件内容等。 数据库
Java扩展JMeter的实现方式的效率比较高,适合于放在常常执行的测试步骤中,可是因为它不是JMeter内置的功能,扩展起来须要有些工做量,并且部署的时候也比较麻烦(分布式运行的时候须要将自定义的JAR拷贝至全部的机器上)。apache
从java请求与beanshell请求的原理来考虑:闭包
一、好比测试java接口,确不想继承AbstractJavaSamplerClient,能够考虑用beanshell请求来完成。app
二、对数据进行参数化时,好比要对字符串进行加密操做、拼成unique类型的ID、定制时间类型等等,能够用beanShell来完成。分布式
三、线程之间想共享一个变量,能够用beanShell实现。ide
定时器: BeanShell Timer 可用来设置线程延迟间隔
前置处理器:BeanShell PreProcessor
采样器: BeanShell Sampler
后置处理器:BeanShell PostProcessor
断言: BeanShell断言
监听器: BeanShell Listener
这几种在使用是时比较相似,只须要用一种重点练习用法就能够。
BeanShell PreProcessor用法(对参数值加密处理返回结果)
经常使用内置变量
目录
1、操做变量
2、操做属性
3、自定义函数
4、引用外部java文件
5、引用外部class文件
6、引用外部Jar包
7、其它用法(接受参数, log等)
三、用法简单总结
1)可以使用用户自定义的变量,在simple中对其进行处理(诸如对其加密、类型转换等),后续请求值使用这些变量与定义函数值;
2)能够在simple中java直接自定义函数,对其一系列处理后,后续请求值使用这些变量与定义函数值;
案例一:使用Jmeter的BeanShell断言,把响应数据中的JSON跟数据库中的记录对比
案例二:jmeter beanShell 修改http请求参数
案例三:JMeter - BeanShellSampler实现本地AES加密、Jmeter接口测试加解密及Bean Shell使用案例
md5加密
import org.apache.commons.codec.digest.DigestUtils; //导入md5加密的包 String str = "1234567"; //要加密的字符串 String md5_after = DigestUtils.md5Hex(str); // md5加密 vars.put("md5_upper",sign.toUpperCase()); //把加密的结果转成大写的,存到md5_upper这个变量里面,参数化的时候直接用${md5_upper}取值就ok了 vars.put("md5_lower",sign.toLowerCase()); //把加密的结果转成小写的,存到md5_lower这个变量里面,参数化的时候直接用${md5_lower}取值就ok了 vars.put("befor_md5",str); //这个是 加密以前的字符串,在beanshell里面定义的变量参数化的时候不能直接使用,须要用vars.put方法才能够用
若是用到签名算法时,可参考:大众点评API
签名算法相似以下:
1. 对除appkey之外的全部请求参数进行字典升序排列;
2. 将以上排序后的参数表进行字符串链接,如key1value1key2value2key3value3...keyNvalueN;
3. 将app key做为前缀,将app secret做为后缀,对该字符串进行SHA-1计算,并转换成16进制编码;
import org.apache.commons.codec.digest.DigestUtils; import java.util.Map; import java.util.HashMap; import java.util.Map.Entry; // 定义Secret String secret = "test"; // 建立参数表 //Map<String, String> paramMap = new HashMap<String, String>(); Map paramMap = new HashMap(); paramMap.put("mobileNumber", "${mobileNumber}"); paramMap.put("loginPword", "test123456"); paramMap.put("time", "${__time(/1000,)}"); paramMap.put("geetest_challenge", ""); paramMap.put("geetest_seccode", ""); paramMap.put("geetest_validate", ""); // 对参数名进行字典排序 String[] keyArray = paramMap.keySet().toArray(new String[0]); Arrays.sort(keyArray); // 拼接有序的参数名-值串 StringBuilder stringBuilder = new StringBuilder(); for (String key : keyArray) { stringBuilder.append(key).append(paramMap.get(key)); } stringBuilder.append(secret); String s = stringBuilder.toString(); // md5加密 String sign = DigestUtils.md5Hex(s); vars.put("sign",sign);
第一步:测试计划添加自定义变量
第二步:添加beanshell请求,处理
第三步:查看结果树,查看结果
result = "\n1:"+bsh.args[0]+"\n"; //1:从参数框中获取参数变量,不适用 result+="2:${testBeanshell}\n"; //2:直接获取变量,操做方便,很是适用 result+="3:"+vars.get("testBeanshell"); //3:从vars内置变量中获取变量,适用 vars.put("testBeanshell","beanshell_change");//改变变量值 result+="\n4:${testBeanshell}";//4:直接获取不生效,由于jmeter尚未对其进行复制 result+="\n5:"+vars.get("testBeanshell");//:5:值改变,容易理解 ResponseCode = 500;//回写请求响应代码,借鉴的http响应码 ResponseMessage = "test ok!!";//回写响应信息 IsSuccess = true;//回写响应结果 log.info("\nlog test:"+result);//调用jmeter内置log对象,日志会打印到jmeter.log中 SampleResult.setResponseData("SampleResult:"+result+"\n");//回写响应数据,SampleResult为jmeter内置回写结果对象,有不少可用方法,能够参看源码 return "return:"+result;//这里的返回值,至关于调用SampleResult.setResponseData()方法,注意使用的return关键字,后面的行都不会执行,且SampleResult.setResponseData("SampleResult:"+result+"\n");也不会执行,这里会被return的结果覆盖。可是用SampleResult.setResponseData()方法回写,后续还能够接代码行,所以建议不用return进行回写响应数据。
红色标注的为入参。能够直接用seling OK中间用空格分开,或用${}来引用。脚本中经过bsh.args来引用,bsh.args[0]表示取的第一个值。
能访问的属性与变量:
SampleResult:访问对应的结果对象,能查询与编辑其中的属性。
ResponseCode:引用自行设置的返回码。
ResponseMessage:设置响应消息内容。
IsSuccess:引用它来决定产生的事务是否成功。若是设置为false那事务会失败。那在结果树与聚合报告中都会显示失败。
案例五:jmeter使用BeanShell Sampler测试本身写的java接口(一)
案例:起多个本地线程jmeter beanshell使用说明