通过案例进行讲解
一、BeanShell 介绍
官网: http://www.BeanShell.org
BeanShell 是一种完全符合 Java 语法规范的脚本语言,具有以下特点:
- 是一种松散类型的脚本语言,类似 JS。
- 是用 Java 写成的小型、免费、可下载的嵌入式 Java 源代码解释器。
- 执行标准 Java 语句和表达式,包含一些脚本命令和语法。
在 JMeter 中,BeanShell 可以对功能进行扩展,对变量进行操作,其主要作用包括:
- 作为定时器(BeanShell Timer)。
- 作为前置处理器(BeanShell PreProcessor)。
- 作为取样器(BeanShell 取样器)。
- 作为后置处理器(BeanShell PostProcessor)。
- 作为断言(BeanShell 断言)。
- 作为监听器(BeanShell Listener)。
二、BeanShell 常用内置变量
-
Log:用于打印日志,最常用且简单,打印在
jmeter.log
中(JMeter安装目录/bin/jmeter.log)- 使用方法:
- 打印 info 形式的普通字符串日志,如
log.info("hello world");
- 拼接字符串和变量,如
log.info("hello world" + "${token}");
- 打印自定义变量,先定义变量再打印,如
str = "hello world"; log.info(str);
- 打印 error 形式的普通字符串日志,如
log.error("ERROR - ERROR");
- 打印 info 形式的普通字符串日志,如
- 查看
- 使用方法:
-
vars:用于存取 JMeter 局部变量,可存取字符串内容或对象。
- 使用方法:
- 获取变量:
vars.get()
。 - 保存变量:
vars.put("key", "value")
。 - 对象保存 JMeter 变量中:
vars.putObject("key", object)
。 - 变量删除:
vars.remove("key")
。 Parameters
保存参数集合,可通过log.info(Parameters);
打印。
- 获取变量:
- 使用方法:
-
props:设置 JMeter 全局的静态变量,实现跨线程组共享变量。
- 使用方法:
- 获取属性变量:
props.get("key")
。 - 存入全局属性:
props.put("key", "value")
。
- 获取属性变量:
- 使用方法:
-
ctx/prev:
ctx
:获取当前线程的上下文信息。prev
:等同于ctx.getPreviousResult
,可获取前一个取样器返回的信息。- 使用方法:
prev.getResponseDataAsString()
:获取响应信息。prev.getResponseCode()
:获取响应 code。
-
其他:
ResponseCode
:响应码。ResponseMessage
:响应结果。SampleResult.setResponseData("Hello world")
:设置响应数据。Label
:表示取样器的名称。IsSuccess
:设置是否成功。
三、BeanShell 实际场景应用
-
登录密码加密(BeanShell 前置处理器)
-
- 在java开发工具中编写代码 Eclipse打jar包(选中该类点击右键->Export->jar file) IDEA打jar包(File–>Project Structure-> Artifacts ->“+”JAR->From Module with dependency,导出,最后Build->Build Artifacts
- 把打好的jar包放到jmeter目录下的apache-jmeter目录的lib下
- 添加前置处理器-BeanShell PreProcessor
- 编写代码,把加密好的结果存在变量中
- 执行测试
-
BeanShell 断言
- BeanShell 断言可使用脚本执行更复杂的个性化断言检查,通过
Failure
和FailureMessage
设置断言结果。 - 案例:与数据库结果进行验证,添加 BeanShell 断言并编写相应代码。
- BeanShell 断言可使用脚本执行更复杂的个性化断言检查,通过
-
线程之间共享变量(BeanShell 后置处理器)
实现步骤:
1. 创建线程组1-登录接口,在接口下添加BeanShell后置处理器, 实现CASTGC=${token},
2. 编写代码: 获取响应,把响应结果转为json对象 获取响应结果放在全局变量中,实现关联
3. 创建线程组2-用例1,header中引用线程组1的变量名称
4.执行线程组2-用例1