JMeter BeanShell在实际测试中的应用

一、BeanShell常用场景

BeanShell最常用的场景:

  • 设置随机数
  • 数据加密
  • 响应报文数据提取
  • 数据库数据提取
  • 复杂逻辑结果断言
  • ......

二、source语法

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组件,

JMeter BeanShell在实际测试中的应用_第1张图片

注意,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会更加明确,但并不总有效果的,我总结了一些常见的出错类型:

  • 语法错误
  • 类型赋值错误
  • 使用了java的高版本语法特性但BeanShell不支持
try {
	// script
}catch (Throwable ex) {
	log.error("", ex);
}

 

你可能感兴趣的:(JMeter)