51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 547|回复: 0

使用beanshell 编写脚本之Jmeter

[复制链接]
  • TA的每日心情
    无聊
    2 小时前
  • 签到天数: 932 天

    连续签到: 4 天

    [LV.10]测试总司令

    发表于 2023-3-6 10:40:14 | 显示全部楼层 |阅读模式
    一、介绍
      1.1 介绍
      BeanShell是一个小型的、免费的、可嵌入使用Java编写的具有对象脚本语言特性的Java源码解释器。
      动态执行所有Java语句、Java代码片段以及弱类型Java和附加的脚本的便利透明地访问所有Java对象和API四种运行模式:命令行、控制台、Applet、远程会话服务。可以在受安全限制的环境下工作,不需要类加载器或者绝大多数功能的字节码生成器,程序只有大约150K的Jar文件。纯Java,免费。
      编写baanshell脚本,使用的语言,几乎跟java一模一样。
      1.2 下载&启动
      下载:
      BeanShell下载地址是:www.beanshell.org

      下载下来是一个jar包,bsh-2.0b4.jar
      启动:
      启动有四种方式,我只用一种方式,其他的可以去百度一下。
      在终端中,执行命令。
       java -jar bsh-2.0b4.jar


      二、jmeter中创建beanshell脚本

      线程组--》添加--》取样器/sampler --》 BeanShell 取样器

      脚本文件:我们可以直接引入写好的脚本。
      脚本:我们自己在jmeter中手写脚本的地方。
      三、jmeter与beanshell 数据交互
      jmeter与beanshell 数据交互,是通过函数实现的。
      vars(JMeterVariables) : 操作jmeter 变量,常用方法:
      vars.get(String key) : 从jmeter中获得变量值。
      vars.put(String key,String value): 将数据存到jmeter变量中。
      -------小技巧---------------------
      我们可以先在idea中,编写beanshell脚本,写完之后,再复制到jmeter中。(因为jmeter 编写脚本时,不方便,没有错误提示等功能)
      3.1 例子1 beanshell 将变量传给jmeter

      beanshell 脚本:
      a= 1;
      b=4;
      q = a+b;
      vars.put("q",q+"")


      运行,然后去结果树中,查看日志。

      注意:
      在脚本中,put q时,为啥要+“” ?
      因为put函数,key 与value 都要求是String格式的,但是在我们的这个脚本中,得到的q的值是:
      int类型的,所以要先转成String再put。(int+Sttring=String)
      vars.put(String key,String value):
      3.2 例子二  jmeter 接收beanshell 生成的变量
      背景:
      一个接口请求,传参,要求传当前的时间,且格式为 yyyy-MM-dd HH:mm:ss
      处理方案:
      beanshell 脚本,将当前时间,格式化为  yyyy-MM-dd HH:mm:ss 格式,然后将值传给jmeter。
      整个jmeter 脚本结构:

      beanshell脚本编写:
      import java.text.*;
      import java.util.*;
      DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      Date d = new Date();
      String dateStr = df.format(d);
      vars.put("current_date",dateStr);


      HTTP 请求,接收参数,current_date
      ${current_date}


      运行jmeter脚本,查看结果树。

       变量引用成功。
      四、jmeter中Beanshell 调用 java 代码
      4.1 调用java文件
      语法:
      source(" java 文件路径") 其中文件路径可以使用绝对路径,也可以使用相对路径。
      source("E:\eclipse\workspace\MD5\src\jmeter\MD5.java"); 或者: source("MD5.java"); --文件位于 jmeter bin 目录下
      String strMd5 = MD5.GetMD5Code("123456");
      举例:
      1、我自定义了一个类CsDIY.java
      package bingfa;
      import java.text.*;
      import java.util.*;

      public class CsDIY {
          public String getCurrentDate(){
              DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
              Date d = new Date();
              String dateStr = df.format(d);
              return dateStr;
          }

      }


      然后将CsDIY.java 放置在了我电脑桌面上。
      2、Beanshell脚本,引用CsDIY.java这个类,并调用其中方法
      source("/Users/zhaohui/Desktop/CsDIY.java");
      CsDIY cs = new CsDIY();
      String dateSSS = cs.getCurrentDate();
      vars.put("dateSSS",dateSSS)


      3、接口请求,使用变量

      4.2  beanshell调用外部 jar 包
      1、提前把 jar 包放入 jmeter lib\ext 目录下并重启;
      2、在jmeter 线程组下,添加http sampler->BeanShell Sampler;
      3、在beasnshell 中的头文件,导入该jar包。
      import 类名;
      示例:
      import com.MD5;
      String strMd5 = MD5.GetMD5Code("123456");


      五、beanshell 打印日志
      log: 写入信息到jmeter.log文件中,使用方法:
      log.info("这里是日志");

      报错:
      ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval    In file: inline evaluation of: `
      WARN o.a.j.p.j.s.BeanShellSampler: Exception executing script. org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval    In file:
      报错处理:
      我没搞定哇。
      六、线程组1生成的动态变量给线程组2用
      6.1 背景:
      测试计划下,两个线程组,线程组1和线程组2。 需要将线程组1 beanshell 脚本产生的变量,给线程组2 用。
      6.2 独立运行线程组:
      当运行测试计划时,线程组1与线程组2是同时运行的。我们需要先运行线程组1,再运行线程组2,为了保证线程组运行顺序,我们需要在测试计划中,勾选独立运行线程组。

      6.3 解决思路及方案
      思路:
      1、线程组1生成变量时,将变量设置为全局变量。
      props.put("xx",xxx);

      2、线程组2,取变量时,取这个全局变量
      props.get("xx")

      方案一:使用beanshell
      在线程组2中,写一个beanshell  脚本,使用props.get("xx") 去取变量
      方案二:使用函数助手
      工具--函数助手--BeanShell
      在表达式中,填写 props.get("xx")
      然后点击生成
      再在线程组2中,直接使用${__BeanShell(props.get("dateSSS"),)}

      七、prev 获取前面的sample返回的信息,再做处理
      getResponseDataAsString():获取响应信息
      getResponseCode(): 获取响应信息
      setDataEncoding(String dataEncoding): 设置响应结果的编码
      7.1 设置上一个sample 的响应结果的编码
      举例:
      背景:
      jmeter脚本结构:

       对 www.baidu.com ,发出请求,查看返回结果:
      发现结果树中,中文都是乱码的。

      解决办法:
      修改返回结果的编码。
      1、在该线程组中,加一个BeanShell 取样器(添加--》取样器--〉 BeanShell 取样器)

       2、 BeanShell 取样器 中编写脚本
      prev.setDataEncoding("utf-8");
      3、将 BeanShell 取样器 放置在被测http请求的后面。(注意放置位置)

       再次进行请求,结果树中的响应结果,就不会再乱码了。

    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-4-18 11:14 , Processed in 0.071244 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表