BeanShell最常用的场景:
BeanShell除了可以import外部jar包外,还有一个十分好用的特性,就是可以可以引用外部BeanShell脚本。
// aa/bb/cc/scriptA.bsh
void printInfo(){
log.info("i am scriptA");
}
// scriptB.bsh
source("aa/bb/cc/scriptA.bsh");
printInfo();
利用source语法可以很好的组织BeanShell脚本。
一般复杂有规则的随机数和数据加密在BeanShell PreProcessor中生成,生成后放入vars里即可。
// BeanShell PreProcessor脚本
String randomValue = "随机数生产";
String DataEncrypt = "数据加密";
vars.put("randomValue", randomValue);
vars.put("DataEncrypt", DataEncrypt);
// sampler请求报文中引用
${randomValue}
${DataEncrypt}
JMeter的JDBC Request组件提供了多种提取数据的方式,这里我只介绍我认为比较直观提取数据的方法。
假设有一张USERS表,字段有ID、USER_NO、USER_NAME、CERTIFICATE_TYPE、CERTIFICATE_NO等,现在需要根据USER_NAME提取USER_NO的值。
首先我们添加JDBC Request组件,
注意,Result variable name必须填写,为结果集添加一个变量名,其类型是一个list,list里每个成员其实是一个map。
随后在JDBC Request组件下添加BeanShell PostProcessor组件,编写数据提取脚本。
// BeanShell PostProcessor
String userNo = String.valueOf(vars.getObject("USERS").get(0).get("USER_NO"));
vars.put("userNo", userNo);
脚本中,get(0)代表结果集的第一行数据。
有时候,JMeter提供的Assertion组件并不能满足我们的要求,这时就需要用到BeanShell Assertion来自定义一些断言逻辑。
...
...
自定义的断言逻辑
...
...
if(断言不通过) {
// 设置当前sampler的结果为测试失败
Failure = true;
// 设置失败信息
FailureMessage = "测试失败";
// 停止当前线程继续执行
Response.setStopThread(true);
}
在JMeter上使用过BeanShell的朋友应该都有这样的体会,报错时完全不知道哪里出错了,那种报错信息完全让人摸不着头脑,这时我们可以把脚本内容加上try...catch块,提示的error会更加明确,但并不总有效果的,我总结了一些常见的出错类型:
try {
// script
}catch (Throwable ex) {
log.error("", ex);
}