【Jmeter】BeanShell 脚本
一、BeanShell
BeanShell是由java编写的,是一个轻量级的脚本语言,也相当于一个小巧免费的JAVA源码解释器,支持对象式的脚本语言特性,亦可嵌入到JAVA源代码中,能动态执行JAVA源代码并为其扩展了脚本语言的一些特性
BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法;
BeanShell是一种松散类型的脚本语言(这点和JS类似);
BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简的解释器jar文件大小为175k。
BeanShell执行标准Java语句和表达式,另外包括一些脚本命令和语法。
二、jmeter中有哪些beanShell
BeanShell 取样器
取样器是被当做当成线程处理
BeanShell 预处理程序
通过编写代码的方式更好的处理接口性能测试中的请求前置入参和后置数据的获取等等
BeanShell 后置处理程序
通过编写代码的方式更好的处理接口性能测试中的请求前置入参和后置数据的获取等等
Tips:BeanShell前置处理器、BeanShell后置处理器 比 BeanShell取样器多一个重置解释器(Reset Interpreter),意思是指:对于每一次处理是不是都要进行重置;
BeanShell 定时器
BeanShell断言
BeanShell 监听器
三、BeanShell在JMeter的作用
(1)对JMeter的功能的扩展;
(2)对jmeter变量的一些操作;
四、BeanShell 常见写法
通过${}可以直接调用
1、在Beanshell面板直接写脚本
String a = vars.get("a"); String b = vars.get("b"); log.info("打印变量a=" + a); log.info("打印变量b=" + b); String new_b = "update_b_" + b; vars.put("b", new_b); log.info("修改后的b值:" + vars.get("b"))
执行结果:
2、引用外部java源文件
public class DemoMethod{ public static String test(String x){ String y = ".java update_" + x; return y; } }
//引用java文件 source("Z:/DemoMethod.java"); //java文件地址 source()找指定的文件 String a=vars.get("a"); log.info("修改前的b值"+vars.get("b")); String new_b = new DemoMethod().test(a); vars.put("b", new_b); log.info("修改后的b值:" + vars.get("b"))
执行结果:
3、应用class文件
编译java文件得到class文件
命令行输入:javac DemoMethod.java
//引用class文件 addClassPath("Z:/"); //指定class文件路径 addClassPath()找指定的路径 import DemoMethod; //导入DemoMethod方法 String a=vars.get("a"); log.info("修改前的b值"+vars.get("b")); String new_b = new DemoMethod().test(a); vars.put("b",new_b); log.info("修改后的b值:" + vars.get("b"))
执行结果:
4、引用外部jar包
将.class 文件生成jar包
命令行输入:jar cvf DemoMethod.jar DemoMethod.class
将jar包复制到 jmeter\lib\ext 路径下< lib\ext路径下存放引入外部的一些jar包>
需要重启下jmeter后生效
// 引用外部jar包 import DemoMethod; // 导入jar包 String a = vars.get("a"); String new_b = new DemoMethod().test(a); log.info("修改前b:" + vars.get("b")); vars.put("b", new_b); log.info("修改后b:" + vars.get("b"));
执行结果:
五、BeanShell常用的内置对象
适用元件
1、log:打印日志
写入信息到jmeber.log文件;<仅输出字符串>
System.out.println("System.out.println 打印demo 练习"); //打印到jmeter.bat的windows批处理 log.info("log.info demo 练习"); // 写入信息到bin目录下的jmeber.log
System打印:
log.info打印:
将打印日志存放到文件中
// 将数据存放到文件中 FileWriter fstream=new FileWriter("D:\\case\\case.txt",true); BufferedWriter out=new BufferedWriter(fstream); out.write("打印数据" + vars.get("a")); out.close(); fstream.close();
2、vars 操作jmeter变量
即JMeterVariables,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map);
常用方法:
(1) vars.get("String key"):从jmeter中获得变量值;
(2) vars.put("String key","String value"):将数据存到jmeter变量中;
结果:
3、POPS 操作JMeter属性
操作jmeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。对应于java.util.Properties。
props的全局性
结果:
4、prev 获取当前请求结果
常用方法:
(1) getResponseDataAsString():获取响应信息。
(2) getResponseCode() :获取响应code。
结果:
5、SampleResult:获取SampleResult对象,能通过这个对象获取想要的信息;
SampleResult中的所有方法都可以通过prev.来调用
SampleLabel:获取接口请求的名称。
SamplerData:获取请求的url和body。
String code = prev.getSampleLabel(); log.info("获取接口请求的名称 :" + code); String msg = prev.getSamplerData(); log.info("获取请求的url和body: " + msg);
执行结果:
6、Response:获取Response对象,能通过这个对象获取响应信息;
ResponseCode:返回接口code成功是200。
ResponseMessage:获取msg成功是OK。
ResponseData:获取response body类型是byte[]。
ResponseHeaders:获取接口服务端返回的头部信息。
RequestHeaders:获取用户端请求的头部信息。
String code = prev.getResponseCode(); log.info("获取接口结果code :" + code); String msg = prev.getResponseMessage(); log.info("获取msg状态: " + msg); String data = prev.getResponseData().toString(); log.info("获取response: " + data); String resph = prev.getResponseHeaders(); log.info("获取接口服务端返回的头部信息 :" + resph); String reqh = prev.getResponseHeaders(); log.info("获取用户端请求的头部信息 :" + reqh); String ctime = prev.getConnectTime().toString(); log.info("获取连接到服务器的时间:" + ctime); String tname = prev.getThreadName(); log.info("获取线程名:" + tname); String name="修改后的线程name"; prev.setThreadName(name); //修改线程名 log.info("修改后的线程名:" + prev.getThreadName());
执行结果:
7、Failure/FailureMessage/设置响应断言
Failure:查看接口调使用能否成功,假如返回false是成功的,true是失败的。
FailureMessage:失败信息,没有设置的时候失败信息是空的,能set这个信息。
状态码断言
log.info("状态码:" + ResponseCode); if(ResponseCode.equals("200")){ Failure=false; } else{ Failure=true; FailureMessage="响应状态码非200"; //指定失败原因 }
执行结果:
响应体包含特定字符
String response = prev.getResponseDataAsString(); log.info("响应体:" + response); //响应数据包含 if(response.contains("成功")){ Failure=false; } else{ Failure=true; FailureMessage="响应数据不包含成功"; }
执行结果:
JSON响应断言
将String类型的响应体转为JSON对象并操作需要额外的JAR包,jar包放入JMeter/lib目录下,重启JMeter
Jar包:
getString(“字段名”): 获取字符串字段值
getBoolean(“字段名”):获取布尔类型字段值。
getInt(“字段名”):获取整型字段值。
getLong(“字段名”):获取长整型字段值。
getDouble(“字段名”):获取双精型字段值。
getJSONObject(“字段名”):获取嵌套Object类型字段值,JSONObject类型。
getJSONArray(“字段名”):获取嵌套Array类型,JSONArray类型。
////JSON响应断言 import org.json.*; //导入org.json包 String response = prev.getResponseDataAsString(); //获取响应数据 JSONObject responseJson = new JSONObject(response); //转为JSON对象 String message = responseJson.getString("msg"); log.info("响应message字段:" + message); if(message.equals("成功")){ Failure=false; } else{ Failure=true; FailureMessage="响应message字段非成功"; }
执行结果:
8、ctx:获取当前线程上下文数据(可获取所有信息)
ctx.getVariables().get(“变量名”):获取变量值(同vars.get())。
ctx.setVariables(“变量名”, “变量值”):设置变量(同vars.put())。
ctx.getProperties().get(“属性名”):获取属性值(同props.get())。
ctx.setProperties(“属性名”,“属性值”):设置属性(同props.put())。
ctx.getPreviousResult():获取当前请求结果同(prev)。
ctx.getCurrentSampler():获取当前采样器。
ctx.getPreviousSampler():获取前一采样器。
ctx.getThreadNum():获取线程数。
ctx.getThreadGroup():获取线程组。
ctx. getThread():获取当前线程。
ctx.getEngine():获取引擎。
ctx.isSamplingStarted():判断采样器是否启动。
ctx.isRecording():判断是否开启录制。
ctx.getSamplerContext():获取采样器山下文数据。
import org.apache.jmeter.samplers.SampleResult; //SampleResult 需要import String a = ctx.getVariables().get("a"); log.info("获取变量值a=" + a); String b = ctx.getProperties().getProperty("b", "update_b"); log.info("获取属性值b=" + b); SampleResult resp = ctx.getPreviousResult(); String rx = resp.getResponseDataAsString(); log.info("获取当前请求结果:" + rx); csn = ctx.getCurrentSampler().getName(); log.info("获取当前取样器:" + csn); csnb = ctx.getPreviousSampler().getName(); log.info("获取前一取样器:" + csnb); tn = ctx.getThreadNum(); log.info("获取线程数:" + tn); tng = ctx.getThreadGroup().getName(); log.info("获取线程组:" + tng); t = ctx.getThread().getThreadName(); log.info("获取当前线程:" + t);
执行结果:
Jmeter 常用API:https://jmeter.apache.org/api/org/apache/jmeter/protocol/http/sampler/HTTPSamplerBase.html
如果万事开头难 那请结局一定圆满 @ Phoenixy
-------------------------------------------------------------------------------------