赞
踩
写JMeter脚本的时候,很多时候都需要调用JMeter的变量,比如:请求头、请求信息、响应头、响应码、响应体等。这时候JMeter的内置变量就排上用场了。
每个beanshell元件支持的变量都不同,每种类型的beanshell都在最下方有说明,例如【BeanShell 取样器】
脚本定义了下列变量:
SampleResult, ResponseCode, ResponseMessage, IsSuccess, Label, FileName, ctx, vars, props, log
BeanShell 预处理程序
Script(variables: ctx vars props prev sampler log)
Script(variables: ctx vars props prev data log)
为脚本定义了下列变量:
Read/Write: Failure, FailureMessage, SampleResult, vars, props, log.
ReadOnly: Response[Data|Code|Message|Headers], RequestHeaders, SampleLabel, SamplerData, ctx
Script(variables: ctx vars props log prev )
Script(variables: ctx vars props samplerEvent samplerResult prev log)
我们可以查看JMeter官方文档说明。里面有对每个变量进行调用的说明。说明文档的结构大体分为三个部分。
JMeterVariables (Apache JMeter dist API)
下面是每个变量的详细汇总,日后工作中可以当做操作文档进行快速的查阅并正确的使用。
项目 | 详细说明 |
变量名(实例) | vars |
JMeter 变量文档说明 | |
适合应用的元件 | 【BeanShell 取样器】、【BeanShell 预处理程序】、【BeanShell 后置处理程序】、 【BeanShell 断言】、【BeanShell 定时器】、【BeanShell 监听器】 |
类 | org.apache.jmeter.threads.JMeterVariables |
public class JMeterVariables方法汇总 | entrySet(),get(String key),getIteration(),getIterator(),getObject(String key),getThreadName(),incIteration(),isSameUserOnNextIteration(),put(String key, String value),putAll(JMeterVariables vars),putAll(Map<String,?> vars),putObject(String key, Object value),remove(String key) |
java.lang.Object方法汇总,可以直接用,例如字符串操作中的toString()。 | clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString |
备注 | 1、vars是org.apache.jmeter.threads.JMeterVariables类的实例,对变量进行读写操作,并且只能在当前线程组内使用。 |
关键方法的实例:
vars.get()和vars.put()
- /* vars.get(String key);
- * 1、从jmeter中获得变量值,如果不存在则为null
- * 2、id_1来自【数据库应用->增删改查场景应用->操作查询场景的“Varialbe names”】
- * 3、跨线程的变量不可以获取
- */
- String id1 = vars.get("id_1");
- log.info("vars.get()方式:" + id1);
-
- /* put(String key, String value);
- * 1、创建或更新一个字符型(String)的变量,如果是非String将会报异常
- * 2、如果是数组或boolean或字典或整型... ...,可以使用toString()方法进行转换
- * 3、JMeter其他元件调用时,直接${变量名}
- *
- */
- vars.put("keys1", "必须字符串123truefalse");
- List list = new ArrayList();
- String a = "aaa";
- int b = 111;
- double c = 12.009;
- list.add(b);
- list.add(a);
- list.add(c);
- vars.put("keys2",list.toString());
vars.getObject()和entrySet(key)
- /* vars.getObject(key);
- * 1、创建一个变量存储Object对象,如果不存在则为null
- * 2、messages来自【数据库应用->增删改查场景应用->操作查询场景的“Result variable name”】
- */
- Object variable_name = vars.getObject("messages");
- log.info("字典【params】: "+variable_name);
-
- /* entrySet(key);
- * 1、an unmodifiable view of the entries contained in JMeterVariables
- *
- */
- Map params = new HashMap(); // 创建一个字典
- params.put("key","values");
- params.put("key1","values1");
- params.put("字典key","存储的value");
- import java.util.Map.Entry;
- Iterator itor = params.entrySet().iterator();
- while(itor.hasNext()){
- Entry entry = (Entry) itor.next();
- log.info("==========key:"+entry.getKey());
- log.info("========Value:"+entry.getValue());
- }
面beanshell脚本运行的结果,可以在JMeter的运行日志可以看到。
vars.getThreadName()和vars.isSameUserOnNextIteration
- /* vars.getThreadName()
- * 1、当前运行线程组的名称
- *
- */
- String threadname = vars.getThreadName();
- log.info("线程组【名称】: "+threadname);
- /* vars.isSameUserOnNextIteration()
- * 1、下一个循环中是否是同一个用户,返回true或者false
- *
- */
- boolean resultsameuser = vars.isSameUserOnNextIteration();
- log.info("下个循环中是否是同一个用户【resultsameuser】: "+resultsameuser);
项目 | 详细说明 |
变量名(实例) | props |
JMeter 变量文档说明 | |
适合应用的元件 | 【BeanShell 取样器】、【BeanShell 预处理程序】、【BeanShell 后置处理程序】、 【BeanShell 断言】、【BeanShell 定时器】、【BeanShell 监听器】 |
类 | java.util.Properties |
Class Properties 方法汇总 | getProperty(String key),getProperty(String key, String defaultValue),list(PrintStream out),list(PrintWriter out),load(InputStream inStream),load(Reader reader),loadFromXML(InputStream in),propertyNames(),save(OutputStream out, String comments),setProperty(String key, String value),store(OutputStream out, String comments),store(Writer writer, String comments),storeToXML(OutputStream os, String comment),storeToXML(OutputStream os, String comment, String encoding),stringPropertyNames() |
java.util.Hashtable方法汇总,可以直接用,例如字符串操作中的toString()。 | clear, clone, compute, computeIfAbsent, computeIfPresent, contains, containsKey, containsValue, elements, entrySet, equals, forEach, get, getOrDefault,hashCode, isEmpty, keys, keySet, merge, put, putAll, putIfAbsent, rehash, remove, remove, replace, replace, replaceAll, size, toString, values |
备注 | props是java.util.Properties的实例,并且继承了 Hashtable 的类。主要对属性进行读写操作。props可以跨线程组使用 |
关键方法的实例:
props.containsKey()和props.contains()
- /* props.containsKey()
- * 1、判断某项属性是否存在,返回布尔值
- *
- */
- boolean isexitst_key = props.containsKey("TESTSTART.MS");
- log.info("是否存在属性key: "+isexitst_key);
- /* props.contains()
- * 1、判断某项值是否存在,返回布尔值
- *
- */
- boolean isexist_value = props.contains("PROPERTY_VALUE");
- log.info("是否存在属性value: "+isexist_value);
props.setProperty()和props.getProperty()
- /* props.setProperty()
- * 1、设置属性的key和value,并且强制对属性键和值使用字符串。
- *
- */
- props.setProperty("cross_thread", "设置跨线程使用属性值");
- props.setProperty("exist_props", "设置props的属性值");
- /* props.getProperty()
- * 1、通过输入的key查找属性值,并且返回。
- *
- */
- int counter=0;
- for( String key : props.keys() ) {
- if (counter%8==0){
- String value = props.getProperty(key);
- log.info("props_keys第" + counter+"key:【" + key + "】;对应的value为: "+ value);
- }
- counter++;
- }
上面beanshell脚本运行的结果,可以在JMeter的运行日志可以看到。
props.remove()和props.values()
- /* props.remove()
- * 1、通过输入的key,删除对应的属性
- *
- */
- props.remove("exist_props");
- String get_value=props.getProperty("exist_props", "已被删除,现在等于默认值了");
- log.info("exist_props是否存在:" + get_value);
- /* props.values()
- * 1、获取所有属性值
- *
- */
- log.info("【获取所有属性值】 "+props.values());
上面beanshell脚本运行的结果,可以在JMeter的运行日志可以看到。
项目 | 详细说明 |
变量名(实例) | ResponseCode/ResponseMessage |
JMeter 变量文档说明 | - |
适合应用的元件 | 【BeanShell 取样器】、【BeanShell 断言】 |
类 | - |
- | - |
- | - |
备注 | ResponseCode、ResponseMessage 是响应报文的响应码和响应信息,其类型为String |
项目 | 详细说明 |
变量名(实例) | IsSuccess |
JMeter 变量文档说明 | - |
适合应用的元件 | 【BeanShell 取样器】 |
类 | java.lang.Boolean |
- | - |
- | - |
备注 | IsSuccess表示sampler的成功失败,其类型为boolean,如果设置为true,表示”成功“,设置为false,表示”失败“。 |
项目 | 详细说明 |
变量名(实例) | Label |
JMeter 变量文档说明 | - |
适合应用的元件 | 【BeanShell 取样器】 |
类 | - |
- | - |
- | |
备注 | Label是sampler的标题,其类型是String。 |
项目 | 详细说明 |
变量名(实例) | FileName |
JMeter 变量文档说明 | - |
适合应用的元件 | 【BeanShell 取样器】 |
类 | - |
- | - |
- | |
备注 | 1、指的是BeanShell采样器的"脚本文件",相当于一个脚本类型的测试片段 2、如果只输入一个文件名(包括文件后缀),则路径默认是JMeter的bin目录 3、支持输入完整的路径+文件名(包括文件后缀) 4、如果"脚本文件"有值的话,beanshell就执行文件的脚本,benshell内的脚本就不会执行 |
实例:
1、新建一个filename_script.txt记事本,记事本的内容为
- log.info("********** filename script start **********");
- vars.put("filename_script","filename script value");
- log.info("********** filename script end **********");
2、将记事本filename_script.txt,放置在JMeter的bin目录下,如果是其他路径的话,需要输入完整的路径+文件名(包括文件后缀)
3、在【BeanShell 取样器】的“脚本文件”输入“filename_script.txt”
上面beanshell脚本运行的结果,可以在JMeter的运行日志可以看到。
结论,
1、beanShell脚本的代码没有执行,而执行了filename_script.txt里面的代码。
2、从日志打印中,filename_script.txt里面的代码是JMeter的一个测试片段。
3、FileName指的是filename_script.txt文件
项目 | 详细说明 |
变量名(实例) | log |
JMeter 变量文档说明 | |
适合应用的元件 | 【BeanShell 取样器】、【BeanShell 预处理程序】、【BeanShell 后置处理程序】、 【BeanShell 断言】、【BeanShell 定时器】、【BeanShell 监听器】 |
类 | org.apache.log.Logger |
public class JMeterContext方法汇总 | atDebug(),atError(),atInfo(),atLevel(Level level),atTrace(),atWarn(),debug(Marker marker, String msg),debug(Marker marker, String format, Object... arguments),debug(Marker marker, String format, Object arg),debug(Marker marker, String format, Object arg1, Object arg2),debug(Marker marker, String msg, Throwable t),debug(String msg),debug(String format, Object... arguments),debug(String format, Object arg),debug(String format, Object arg1, Object arg2),debug(String msg, Throwable t),error(Marker marker, String msg),error(Marker marker, String format, Object... arguments),error(Marker marker, String format, Object arg),error(Marker marker, String format, Object arg1, Object arg2),error(Marker marker, String msg, Throwable t),error(String msg),error(String format, Object... arguments),error(String format, Object arg),error(String format, Object arg1, Object arg2),error(String msg, Throwable t),getName(),info(Marker marker, String msg),info(Marker marker, String format, Object... arguments),info(Marker marker, String format, Object arg),info(Marker marker, String format, Object arg1, Object arg2),info(Marker marker, String msg, Throwable t),info(String msg),info(String format, Object... arguments),info(String format, Object arg),info(String format, Object arg1, Object arg2),info(String msg, Throwable t),isDebugEnabled(),isDebugEnabled(Marker marker),isEnabledForLevel(Level level),isErrorEnabled(),isErrorEnabled(Marker marker),isInfoEnabled(),isInfoEnabled(Marker marker),isTraceEnabled(),isTraceEnabled(Marker marker),isWarnEnabled(),isWarnEnabled(Marker marker),makeLoggingEventBuilder(Level level),trace(Marker marker, String msg),trace(Marker marker, String format, Object... argArray),trace(Marker marker, String format, Object arg),trace(Marker marker, String format, Object arg1, Object arg2),trace(Marker marker, String msg, Throwable t),trace(String msg),trace(String format, Object... arguments),trace(String format, Object arg),trace(String format, Object arg1, Object arg2),trace(String msg, Throwable t),warn(Marker marker, String msg),warn(Marker marker, String format, Object... arguments),warn(Marker marker, String format, Object arg),warn(Marker marker, String format, Object arg1, Object arg2),warn(Marker marker, String msg, Throwable t),warn(String msg),warn(String format, Object... arguments),warn(String format, Object arg),warn(String format, Object arg1, Object arg2),warn(String msg, Throwable t) |
- | |
备注 | 1、日志信息写入到jmeter.log文件 |
实例:
- // 点击“方法汇总” 中info,warn,error只需输入msg的参数
- log.info("普通信息 -> 打印ResponseCode = " + ResponseCode);
- log.warn("警告信息 -> 打印Label = " + Label);
- log.error("出错信息 -> 打印ResponseMessage = " + ResponseMessage);
上面beanshell脚本运行的结果,可以在JMeter的运行日志可以看到。
当我们运行一个项目时,产生很多的日志,这时我们需要分辨出,日志是从哪个beanshell打印出来的。我们使用xxx(String format, Object arg1, Object arg2)这种方法
- // 点击“方法汇总” 中info,warn,error输入(String format, Object arg1, Object arg2)的参数的方法。
- int infomsg=123456789;
- log.info(" 【{}】-> {}", Label, infomsg);
- String warnmsg="警告信息内容";
- log.warn(" 【{}】-> {}", Label, warnmsg);
- String errormsg="出错信息内容";
- log.error("【{}】-> {}", Label, errormsg);
上面beanshell脚本运行的结果,可以在JMeter的运行日志可以看到。
项目 | 详细说明 |
变量名(实例) | sample |
JMeter 变量文档说明 | |
适合应用的元件 | 【BeanShell 预处理程序】 |
类 | org.apache.jmeter.samplers |
public class Sampler方法汇总 | 支持获取所有取样器的信息,可点击下列取样器获取对应的方法:AbstractSampler, AccessLogSampler, AjpSampler, BaseJMSSampler, BeanShellSampler, BoltSampler, BSFSampler, DebugSampler, FTPSampler, HTTPSampler, HTTPSamplerBase, HTTPSamplerProxy, JavaSampler, JDBCSampler, JMSSampler, JSR223Sampler, JUnitSampler, LDAPExtSampler, LDAPSampler, MailReaderSampler, MongoScriptSampler, PublisherSampler, SmtpSampler, SubscriberSampler, SystemSampler, TCPSampler, TestAction, TransactionSampler |
- | |
备注 | 可以获取对应取样器(sample)的信息,也可以设置。 |
项目 | 详细说明 |
变量名(实例) | prev |
JMeter 变量文档说明 | |
适合应用的元件 | 【BeanShell 预处理程序】、【BeanShell 后置处理程序】、【BeanShell 定时器】、【BeanShell 监听器】 |
类 | org.apache.jmeter.samplers.SampleResult |
public class JMeterContext方法汇总 | 同SampleResult |
java.lang.Object方法汇总,可以直接用,例如字符串操作中的toString()。 | 同SampleResult |
备注 | 1、prev和SampleResult是当前sampler的结果,其类型为SampleResult 2、可以读写sampler的信息和控制sampler的行为 |
关键方法的实例:
- try{
- thread.sleep(2000);
- }catch(InterruptedException e){
- e.printStackTrace();
- }
项目 | 详细说明 |
变量名(实例) | Failure/FailureMessage |
JMeter 变量文档说明 | - |
适合应用的元件 | 【BeanShell断言】 |
类 | |
public class Sampler方法汇总 | - |
- | - |
备注 | 1、Failure和FailureMessage是BeanShell Assertion组件独有的内置变量 2、Failure断言是否成功(false为断言成功,true为断言失败),FailureMessage为断言失败描述 |
项目 | 详细说明 |
变量名(实例) | SampleLabel |
JMeter 变量文档说明 | - |
适合应用的元件 | 【BeanShell断言】 |
类 | - |
- | - |
- | |
备注 | SampleLabel是【BeanShell断言】的标题,其类型是String。 |
项目 | 详细说明 |
变量名(实例) | SamplerData |
JMeter 变量文档说明 | - |
适合应用的元件 | 【BeanShell断言】 |
类 | - |
- | - |
- | |
备注 | SamplerData就是sampler data(请求数据),其类型为byte[ ] |
项目 | 详细说明 |
变量名(实例) | samplerEvent |
JMeter 变量文档说明 | - |
适合应用的元件 | 【BeanShell 监听器】 |
类 | - |
- | - |
- | |
备注 | ? |
项目 | 详细说明 |
变量名(实例) | bsh.args与Parameters |
JMeter 变量文档说明 | - |
适合应用的元件 | 【BeanShell 取样器】、【BeanShell 预处理程序】、【BeanShell 后置处理程序】、 【BeanShell 断言】、【BeanShell 定时器】、【BeanShell 监听器】 |
类 | - |
- | - |
- | - |
备注 | 1、输入多个参数时,要用空格隔开。 2、Parameters存储的类型是String类型。 3、bsh.args存储的参数的集合,通过bsh.args[n]取对应位置的参数值,但是取出来的参数值也是String类型。 |
实例:
运行一个简单的例子,就能明白其中的用法。
- log.info(" 【{}】-> {}", Label, "bsh.args与Parameters调试starte");
- log.info(" 【{}】-> {}", Label, "bsh.args 当前第1个位置参数的value值" + bsh.args[0]);
- log.info(" 【{}】-> {}", Label, "bsh.args[0]变量的类型是:" + bsh.args[0].getClass().getSimpleName());
-
- log.info(" 【{}】-> {}", Label, "bsh.args 当前第2个位置参数的value值" + bsh.args[1]);
- log.info(" 【{}】-> {}", Label, "bsh.args[1]变量的类型是:" + bsh.args[1].getClass().getSimpleName());
-
- log.info(" 【{}】-> {}", Label, "bsh.args 当前第3个位置参数的value值" + bsh.args[2]);
- log.info(" 【{}】-> {}", Label, "bsh.args[2]变量的类型是:" + bsh.args[2].getClass().getSimpleName());
-
- log.info(" 【{}】-> {}", Label, "Parameters变量是个字符串,存储参数的值: " + Parameters);
- log.info(" 【{}】-> {}", Label, "bsh.args与Parameters调试end");
上面beanshell脚本运行的结果,可以在JMeter的运行日志可以看到。
从实际的编程中,有很多场景我们并不知道传的参数有多少个。只要稍微的改造一下,也能实现匹配不确定的传参。
进阶传参场景实例:
第一步:
模拟不确定传参的变量场景(可以通过csv文件,用户定义的变量,数据库... ...),本次使用【用户定义的变量】。
第二步:
beanshell参数调用【用户定义的变量】的变量,并且通过上面学习的for循环处理变量。样例如下所示:
- log.info(" 【{}】-> {}", Label, "bsh.args与Parameters\"不确定传参\"调试starte");
- for(int i = 0; i< bsh.args.length ; i++){
- log.info(" 【{}】-> {}", Label, "bsh.args 当前第"+i+"个位置参数的value值" + bsh.args[i]);
- vars.put("bsh_args"+i, bsh.args[i]);
- }
- log.info(" 【{}】-> {}", Label, "bsh.args与Parameters\"不确定传参\"调试end");
第三步:
上面beanshell脚本运行的结果
第四步:
通过【调试取样器】检查不确定传参的变量拆分的是否正确。
如果遇到实际工作中,需要实现复杂的功能,或者研发已经有的功能的话,我们可以和研发沟通同一些,让他们帮忙把他们的功能封装成功一个类或方法,打包成java代码或者jar包甚至是编译后的class文件。我们就可以在beanshell直接引用他们的功能了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。