[转帖]jmeter 使用beanshell 编写脚本

jmeter,使用,beanshell,编写,脚本 · 浏览次数 : 0

小编点评

1、线程组1生成变量时,将变量设置为全局变量。 props.put("xx",xxx); 2、线程组2,取变量时,取这个全局变量 props.get("xx") 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\"); 5、prev 获取前面的sample返回的信息,再做处理 getResponseDataAsString():获取响应信息 getResponseCode(): 获取响应信息 setDataEncoding(String dataEncoding): 设置响应结果的编码 6、验签处理&加密 jmeter脚本处理加密验签_做测试的喵酱的博客-CSDN博客 7、prev 获取前面的sample返回的信息,再做处理 getResponseDataAsString():获取响应信息 getResponseCode(): 获取响应信息 setDataEncoding(String dataEncoding): 设置响应结果的编码 8、beanshell应用 BeanShell PreProcessor 提前处理请求参数,如:图片处理,加密解密等 BeanShell PostProcessor 在请求后对返回结果进行处理 BeanShell 断言 验证返回结果的正确性

正文

目录

一、介绍

1.1 介绍

1.2 下载&启动

 二、jmeter中创建beanshell脚本

三、jmeter与beanshell 数据交互

3.1 例子1 beanshell 将变量传给jmeter

3.2 例子二  jmeter 接收beanshell 生成的变量

四、jmeter中Beanshell 调用 java 代码

4.1 调用java文件

4.2  beanshell调用外部 jar 包

五、beanshell 打印日志

六、线程组1生成的动态变量给线程组2用

6.1 背景:

6.2 独立运行线程组:

6.3 解决思路及方案

思路:

方案一:使用beanshell 

方案二:使用函数助手

七、prev 获取前面的sample返回的信息,再做处理

7.1 设置上一个sample 的响应结果的编码

八、beanshell应用

8.1 验签处理&加密


一、介绍

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 脚本:

  1. a= 1;
  2. b=4;
  3. q = a+b;
  4. 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脚本编写:

  1. import java.text.*;
  2. import java.util.*;
  3. DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  4. Date d = new Date();
  5. String dateStr = df.format(d);
  6. 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

  1. package bingfa;
  2. import java.text.*;
  3. import java.util.*;
  4. public class CsDIY {
  5. public String getCurrentDate(){
  6. DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  7. Date d = new Date();
  8. String dateStr = df.format(d);
  9. return dateStr;
  10. }
  11. }

然后将CsDIY.java 放置在了我电脑桌面上。

2、Beanshell脚本,引用CsDIY.java这个类,并调用其中方法

  1. source("/Users/zhaohui/Desktop/CsDIY.java");
  2. CsDIY cs = new CsDIY();
  3. String dateSSS = cs.getCurrentDate();
  4. 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请求的后面。(注意放置位置)

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

八、beanshell应用

BeanShell PreProcessor

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

BeanShell PostProcessor

在请求后对返回结果进行处理

BeanShell 断言

验证返回结果的正确性

BeanShell Sampler

8.1 验签处理&加密

jmeter脚本处理加密验签_做测试的喵酱的博客-CSDN博客

    <div id="blogExtensionBox" style="width:400px;margin:auto;margin-top:12px" class="blog-extension-box"><div class="blog_extension blog_extension_type2" id="blog_extension">
      <div class="extension_official" data-report-click="{&quot;spm&quot;:&quot;1001.2101.3001.6471&quot;}" data-report-view="{&quot;spm&quot;:&quot;1001.2101.3001.6471&quot;}">
      <div class="blog_extension_card_left">
        <img src="https://img-blog.csdnimg.cn/ab4f72676f0847b58f9a9f7e207f1466.jpeg" alt="">
      </div>
      <div class="blog_extension_card_cont">
        <span class="text">测试童鞋</span>
        <div class="blog_extension_card_cont_r">
          <img class="weixin" src="https://g.csdnimg.cn/extension-box/1.1.6/image/weixin.png" alt="">
          <span>微信名片</span>
        </div>
      </div>
      <img class="blog_extension_card_right" src="https://g.csdnimg.cn/extension-box/1.1.6/image/ic_move.png" alt="">
    </div></div></div>
</article>

与[转帖]jmeter 使用beanshell 编写脚本相似的内容:

[转帖]jmeter 使用beanshell 编写脚本

目录 一、介绍 1.1 介绍 1.2 下载&启动 二、jmeter中创建beanshell脚本 三、jmeter与beanshell 数据交互 3.1 例子1 beanshell 将变量传给jmeter 3.2 例子二 jmeter 接收beanshell 生成的变量 四、jmeter中Beansh

[转帖]jmeter编写测试脚本大全

目录 一、背景 二、按照功能划分 2.1 加密处理、验签处理 2.2 jmeter 使用beanshell 编写脚本 2.3 jmeter脚本报错大全 2.4 jmeter打印log 2.5 jmeter压测java代码 2.6 jmeter读取数据保证每个线程拿到的数据唯一 2.7 jmeter设

[转帖]Jmeter正则提取器常用的几种方式

https://www.cnblogs.com/a00ium/p/10483741.html 使用jmeter的同学都知道,jmeter提供了各种各样的提取器,如jsonpath、Beanshell、Xpath、正则等!!! 我们就针对正则提取器如何使用进行说明。 举例说明:假设取sessionId

[转帖]jmeter之使用csv文件传递参数-05篇

csv文件格式,第一列为手机号,第二列为密码 1.右键添加一个配置元件 csv数据文件设置 2.设置csv数据提取路径 3.引用数据 4.设置线程循环运行两次,然后发送请求 看到结果就执行了两次,取得用户名和密码发生了变化

[转帖]JMeter 5.5 使用详解(持续更新中......)

`https://blog.csdn.net/qq_45138120/article/details/124056704?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168835430516800188578210%2522%252

[转帖]JMeter学习(二)搭建骨架--JMeter重要组件

https://www.cnblogs.com/tian-yong/p/4460665.html JMeter的属性和变量 JMeter属性统一定义在jmeter.properties文件中。JMeter属性在测试脚本的任何地方都是可见的(全局),通常被用来定义 一些JMeter使用的默认值。例如,

[转帖]Jmeter笔记:使用Jmeter向kafka发送消息

https://www.cnblogs.com/daydayup-lin/p/14124816.html 日常工作中有时候需要向kafka中发送消息来测试功能或者性能,这时候我们怎么办呢?我之前是自己写个简单的python脚本来模拟发送消息的,其实用Jmeter来实现也比较简单方便。 1、我们必须有

[转帖]【软件测试】Jmeter性能测试(性能测试,Jmeter使用与结果分析)

文章目录 前言一、性能测试1. 什么是性能测试?2. 性能测试的重要性3. 性能指标——QPS和TPS①QPS②TPS 二、压测工具Jmeter1. 什么是Jmeter?2. Jmeter主要元件3. 下载安装 三、一个简单的测试案例①新建一个线程组②新建一个HTTP请求③添加HTTP信息头(请求头

[转帖]jmeter压力测试

使用jmeter 进行并发压力测试。 首先需要安装好jmeter,下面以widows操作平台为例: 1、确保电脑安装并配置好java环境;具体怎么下载和配置请自行百度; 2、登录jmeter官网http://jmeter.apache.org/download_jmeter.cgi,点击如下图操作

[转帖]Jmeter 参数化

一、Jmeter参数化概念 当使用JMeter进行测试时,测试数据的准备是一项重要的工作。若要求每次迭代的数据不一样时,则需进行参数化,然后从参数化的文件中来读取测试数据。 参数化是自动化测试脚本的一种常用技巧。简单来说,参数化的一般用法就是将脚本中的某些输入使用参数来代替,在脚本运行时指定参数的取