Jmeter中的BeanShell工具使用

BeanShell是一个小型嵌入式Java源代码解释器,完全兼容java语法。同时BeanShell也支持javascript和python的一些语法,可谓是一个精巧、集大成的小工具,本文我们就重点说说这个小工具能在jmeter接口测试、压测过程中的一些用法。

一、BeanShell简介

1、BeanShell应用场景

  • 提供的java语法,可以做复杂的逻辑或者业务场景的判断
  • 可以引用开发编写好的jar包实现功能,需要借助”测试计划“模块的jar包导入功能
  • 接口测试中处理关联数据
  • 跨线程组共享变量

2、jmeter中的BeanShell类型

  • 取样器BeanShell
  • 前置处理器BeanShell
  • 后置处理器BeanShell
  • 定时器BeanShell
  • 断言BeanShell
  • 监听器BeanShell

二、BeanShell常用内置变量

1、log日志模块

提供不同等级的日志信息输出。

log.info("这是我的第一个beanshell脚本");
log.error("这是一条报错的日志");

2、vars模块

全称为JmeterVariables,表示jmeter变量,vars的变量作用域在同一线程组,不可跨线程组。

  • vars.get(String key):从jmeter中获得变量值
  • vars.put(String key,String value):数据输出到jmeter变量中
// 先获取token值,java语法
String aa = vars.get("token");
// 在aa的前面添加Token前缀
String token1 = "Token "+aa;
log.info(token1);
//将拼接后的数据再写回到jmeter变量中
vars.put("token",token1);

3、props模块

操作jmter属性,该变量引用了jmeter的配置信息,可获取jmeter属性,使用方法与vars类似,这个全局变量是可以跨线程组的。

props.put("name","value");//添加变量,非临时的,只要添加进去,就保存下来,一直有。
props.remove("name");//删除变量
props.get(key); //获得一个变量

4、prev模块

获取当前sample返回响应信息,常用如下:

//获取到第一个接口的返回码和返回数据
log.info(prev.getResponseCode())
log.info(prev.getResponseDataAsString())
  • getThreadName获取线程名:log.error("getThreadName: " + prev.getThreadName());
  • getRequestHeaders获取请求头:log.error("getRequestHeaders: " + prev.getRequestHeaders());
  • getUrlAsString获取url并转为string:log.error("getUrlAsString: " + prev.getUrlAsString());
  • getSamplerData获取sample数据:log.error("getSampleData: " + prev.getSamplerData());
  • getSampleLabel获取sample名称:log.error("getSampleLabel: " + prev.getSampleLabel());
  • getResponseCode获取响应码:log.error("getResponseCode: " + prev.getResponseCode());
  • getResponseHeaders获取响应头:log.error("getResponseHeaders: " + prev.getResponseHeaders());
  • getResponseMessage获取响应信息:log.error("getResponseMessage: " + prev.getResponseMessage());
  • getResponseDataAsString获取响应数据并转为字符串:log.error("getResponseDataAsString: " + prev.getResponseDataAsString());

三、BeanShell常见应用场景

1、java文件处理

BeanShell是可以使用source()方法直接导入外部的java文件,并进行直接编程的。

//导入本地java文件,注意使用\\
source("E:\\3-Learning\\22-BK2301\\javademo\\mianxiangduixiang\\Student.java");
//直接调用java文件中的类生成对象,并且通过这个对象调用里面的方法
Student s= new Student();
String id =s.id;
log.error("student对象s的id属性值为:"+id);

2、导入外部jar包

从测试计划模块直接导入外部开发完成的jar包,即可导入、使用其中的类和方法。

  • 添加ToImage.jar包
  • 添加sun.misc.BASE64Decoder.jar包
  • 定义一个变量code,用于中转存储验证码数据

BeanShell中即可直接导入使用:

import com.qf.ToImage;

//先将图像文件读入到此处,转为base64
String aaa = ToImage.GetImageStr("E:/1.png");
System.out.println(aaa);
//使用put方法将加密的图片数据输出到code变量(测试计划中定义)中
vars.put("code",aaa);

补充:也可以将jar文件放到jmeter/lib/ext目录下,重启jmeter即可使用beanshell封装import调用jar包内的方法

3、BeanShell PreProcessor

提前处理请求参数,如:图片处理,加密解密、日期处理等。

import java.text.SimpleDateFormat;
 
import java.util.Calendar;
 
 
 
Calendar cal = Calendar.getInstance();//使用默认时区时间获取一个日历
 
SimpleDateFormat df = new  SimpleDateFormat("YYYY-MM-dd");
 
String time1= df.format(cal.getTime());
 
cal.add(Calendar.DAY_OF_MONTH, +2);
 
String time2= df.format(cal.getTime());
 
 
 
vars.put("Time1",time1);
 
vars.put("Time2",time2);

4、BeanShell PostProcessor

可以对请求完成后的响应数据的处理,实现接口关联、数据加密处理、解决乱码、中文显示等。

下面代码实现将响应正文的unicode编码转为中文显示:

String s=new String(prev.getResponseData(),"UTF-8");
        char aChar;
        int len= s.length();
        StringBuffer outBuffer=new StringBuffer(len);
        for(int x =0; x <len;){
            aChar= s.charAt(x++);
            if(aChar=='\\'){
                aChar= s.charAt(x++);
                if(aChar=='u'){
                    int value =0;
                    for(int i=0;i<4;i++){
                        aChar= s.charAt(x++);
                        switch(aChar){
                            case'0':
                            case'1':
                            case'2':
                            case'3':
                            case'4':
                            case'5':
                            case'6':
                            case'7':
                            case'8':
                            case'9':
                                value=(value <<4)+aChar-'0';
                                break;
                            case'a':
                            case'b':
                            case'c':
                            case'd':
                            case'e':
                            case'f':
                                value=(value <<4)+10+aChar-'a';
                                break;
                            case'A':
                            case'B':
                            case'C':
                            case'D':
                            case'E':
                            case'F':
                                value=(value <<4)+10+aChar-'A';
                                break;
                            default:
                                throw new IllegalArgumentException(
                                        "Malformed   \\uxxxx  encoding.");}}
                    outBuffer.append((char) value);}else{
                    if(aChar=='t')
                        aChar='\t';
                    else if(aChar=='r')
                    aChar='\r';
                    else if(aChar=='n')
                    aChar='\n';
                    else if(aChar=='f')
                    aChar='\f';
                    outBuffer.append(aChar);}}else
                outBuffer.append(aChar);}
        prev.setResponseData(outBuffer.toString());

5、BeanShell断言

验证返回结果的正确性,如下验证noticeId的长度。

if("${noticeId}".length() != 36)
 
{
   Failure = true;
   FailureMessage = "error";
}

6、BeanShell Sampler

发送beanshell请求,如下是随意写的内容,直接放在beanshell sample下。

x=2;
 
y=x+2;
 
print("just for test !");//print打印的结果可以在jmeter控制台查看
 
log.info(y+"");//log只能传字符串变量,log输出内容在日志可直接看
 
vars.put("name","test20190517");
posted @ 2024-04-16 10:11  小强找BUG  阅读(1368)  评论(0)    收藏  举报