赞
踩
目录
3.2 例子二 jmeter 接收beanshell 生成的变量
BeanShell是一个小型的、免费的、可嵌入使用Java编写的具有对象脚本语言特性的Java源码解释器。
BeanShell是一种完全符合Java语法规则的脚本语言,同时他还有自己的语法规则。
动态执行所有Java语句、Java代码片段以及弱类型Java和附加的脚本的便利
透明地访问所有Java对象和API
四种运行模式:命令行、控制台、Applet、远程会话服务
可以在受安全限制的环境下工作,不需要类加载器或者绝大多数功能的字节码生成器
程序只有大约150K的Jar文件
纯Java
免费
编写baanshell脚本,使用的语言,几乎跟java一模一样。
下载:
BeanShell下载地址是:www.beanshell.org
下载下来是一个jar包,bsh-2.0b4.jar
启动:
启动有四种方式,我只用一种方式,其他的可以去百度一下。
在终端中,执行命令
java -jar bsh-2.0b4.jar
线程组--》添加--》取样器/sampler --》 BeanShell 取样器
脚本文件:我们可以直接引入写好的脚本
脚本:我们自己在jmeter中手写脚本的地方。
jmeter与beanshell 数据交互,是通过函数实现的。
vars(JMeterVariables) : 操作jmeter 变量,常用方法:
vars.get(String key) : 从jmeter中获得变量值
vars.put(String key,String value): 将数据存到jmeter变量中。
-------小技巧---------------------
我们可以先在idea中,编写beanshell脚本,写完之后,再复制到jmeter中。(因为jmeter 编写脚本时,不方便,没有错误提示等功能)
beanshell 脚本:
- a= 1;
- b=4;
- q = a+b;
- vars.put("q",q+"")
运行,然后去结果树中,查看日志。
注意:
在脚本中,put q时,为啥要+“” ?
因为put函数,key 与value 都要求是String格式的,但是在我们的这个脚本中,得到的q的值是
int类型的,所以要先转成String再put。(int+Sttring=String)
vars.put(String key,String value):
背景:
一个接口请求,传参,要求传当前的时间,且格式为 yyyy-MM-dd HH:mm:ss
处理方案:
beanshell 脚本,将当前时间,格式化为 yyyy-MM-dd HH:mm:ss 格式,然后将值传给jmeter
整个jmeter 脚本结构
beanshell脚本编写:
- import java.text.*;
- import java.util.*;
- DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- Date d = new Date();
- String dateStr = df.format(d);
- vars.put("current_date",dateStr);
HTTP 请求,接收参数,current_date
${current_date}
运行jmeter脚本,查看结果树。
变量引用成功。
语法:
source(" java 文件路径") 其中文件路径可以使用绝对路径,也可以使用相对路径。
source("E:\eclipse\workspace\MD5\src\jmeter\MD5.java"); 或者: source("MD5.java"); --文件位于 jmeter bin 目录下
String strMd5 = MD5.GetMD5Code("123456");
举例:
1、我自定义了一个类CsDIY.java
- package bingfa;
- import java.text.*;
- import java.util.*;
-
- public class CsDIY {
- public String getCurrentDate(){
- DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- Date d = new Date();
- String dateStr = df.format(d);
- return dateStr;
- }
-
- }
-
-
然后将CsDIY.java 放置在了我电脑桌面上。
2、Beanshell脚本,引用CsDIY.java这个类,并调用其中方法
- source("/Users/zhaohui/Desktop/CsDIY.java");
- CsDIY cs = new CsDIY();
- String dateSSS = cs.getCurrentDate();
- vars.put("dateSSS",dateSSS)
3、接口请求,使用变量
1、提前把 jar 包放入 jmeter lib\ext 目录下并重启;
2、在jmeter 线程组下,添加http sampler->BeanShell Sampler
3、在beasnshell 中的头文件,导入该jar包
import 类名;
示例:
import com.MD5;
String strMd5 = MD5.GetMD5Code("123456");
log: 写入信息到jmeter.log文件中。
log输出4个级别与使用方法:
- log.debug("我是日志1---------");
- log.info("我是日志2---------");
- log.warn("我是日志3---------");
- log.error("我是日志4---------");
查看打印的日志:
方法一:Jmeter日志默认存放在%JMeter_HOME%\bil\JMeter.log
方法二:JMeter里面点击右上角可以打开日志窗口
log.info(“abc”)——输出常量
log.info(name);——输出beanshell定义的变量
log.info(${name});——输出Jmeter定义的变量
vars表示:JmeterVariables,操作Jmeter变量(只能在当前线程组使用)
- //获取变量的值
- log.info(vars.get("hhh"));
- log.info(vars.get("access_token"));
- vars.put("www","yyy");
props用于存取Jmeter的全局静态变量(可以跨线程组)
- //获取全局静态变量
- log.info(props.get("jmeter.save.saveservice.output_format"));
- props.put("aaa","bbb");
prov获取到当前一个取样器返回的信息
- //获取前面取样器的值
- log.info(prev.getResponseCode());
- log.info(prev.getResponseDataAsString());
- //获取上下文所有的变量
- System.out.println(ctx.getProperties());
测试计划下,两个线程组,线程组1和线程组2。 需要将线程组1 beanshell 脚本产生的变量,给线程组2 用。
当运行测试计划时,线程组1与线程组2是同时运行的。我们需要先运行线程组1,再运行线程组2,为了保证线程组运行顺序,我们需要在测试计划中,勾选独立运行线程组。
1、线程组1生成变量时,将变量设置为全局变量。
props.put("xx",xxx);
2、线程组2,取变量时,取这个全局变量
props.get("xx")
在线程组2中,写一个beanshell 脚本,使用props.get("xx") 去取变量
线程组1
- a=1;
- b=3;
- c=a+b;
- props.put("c",c+"");
线程组2
- d=props.get("c");
- log.info(d+"-------------");
工具--函数助手--BeanShell
在表达式中,填写 props.get("xx")
然后点击生成
再在线程组2中,直接使用${__BeanShell(props.get("dateSSS"),)}
线程组2
- d=${__BeanShell(props.get("c"),)};
- log.info(d+"-------------");
getResponseDataAsString():获取响应信息
getResponseCode(): 获取响应信息
setDataEncoding(String dataEncoding): 设置响应结果的编码
举例:
背景:
jmeter脚本结构:
对 www.baidu.com ,发出请求,查看返回结果:
发现结果树中,中文都是乱码的。
解决办法:
修改返回结果的编码。
1、在该线程组中,加一个BeanShell 取样器(添加--》取样器--〉 BeanShell 取样器)
2、 BeanShell 取样器 中编写脚本
prev.setDataEncoding("utf-8");
3、将 BeanShell 取样器 放置在被测http请求的后面。(注意放置位置)
再次进行请求,结果树中的响应结果,就不会再乱码了。
BeanShell PreProcessor
提前处理请求参数,如:图片处理,加密解密等
BeanShell PostProcessor
在请求后对返回结果进行处理
BeanShell 断言
验证返回结果的正确性
BeanShell Sampler
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。