• 【性能测试】初识 Jmeter 中的 BeanShell


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

    1.简介

    1.1 应用场景

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

    1.2 BeanShell 类型

    • 采样器BeanShell Sampler):发送 BeanShell 请求。
    • 前置处理器BeanShell PreProcessor):提前处理请求参数,如:图片处理,加密解密、日期处理等。
    • 后置处理器BeanShell PostProcessor):可以对请求完成后的响应数据的处理,实现接口关联、数据加密处理、解决乱码、中文显示等。
    • 定时器BeanShell Timer):定时器会让作用域内的每一个采样器都在执行前等待一个固定的时长。
    • 断言Beanshell Assertion):验证返回结果的正确性。
    • 监听器BeanShell Listener):监听器用来监听及显示 JMeter 取样器测试结果,能够以树、表及图形形式显示测试结果,也可以以文件方式保存测试结果。

    2.常用内置变量

    在这里插入图片描述

    2.1 log 日志模块

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

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

    2.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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.3 props 模块

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

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

    2.4 prev 模块

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

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

    在这里插入图片描述

    3.常见应用场景

    3.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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    3.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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述
    补充:也可以将 jar 文件放到 jmeter/lib/ext 目录下,重启 Jmeter 后,即可使用 import 调用 jar 包内的方法。

  • 相关阅读:
    fishhook原理
    【Django框架】——20 Django视图 02 路由命名和反向解析
    简要归纳UE5 Lumen全局光照原理
    WPF 项目开发入门(四) MVVM 模式 与 TreeView树组件
    视频太大怎么压缩变小?超过1G的视频这样压缩
    11、将数组中的 0 移动到末尾
    设计模式与应用:原型模式
    Unity基础01——3D数学
    vue快速入门(四十)非父子组件通信
    基础算法--二分查找
  • 原文地址:https://blog.csdn.net/be_racle/article/details/134085613