最近学习使用了jmeter来对接口进行测试。使用jmter进行接口测试,有时候需要编写一些BeanShell脚本语言,或者利用BeanShell调用自己的工具类,来完成jmeter基本功能中无法实现的功能,下面将对BeanShell Sampler及其相关使用作一个简要的介绍。

一、什么是BeanShell

BeanShell是一个小型嵌入式Java源代码解释器,具有对象脚本语言特性,能够动态地执行标准JAVA语法,并利用在JavaScript和Perl中常见的的松散类型、命令、闭包等通用脚本来对其进行拓展。BeanShell不仅仅可以通过运行其内部的脚本来处理Java应用程序,还可以在运行过程中动态执行你java应用程序执行java代码。因为BeanShell是用java写的,运行在同一个虚拟机的应用程序,因此可以自由地引用对象脚本并返回结果。

二.、BeanShell的特点

·完整的java语法的动态执行,java代码片段,以及松散类型的java和其他脚本。

·透明地访问所有java对象和API

·运行在四种模式:命令行,控制台,小程序,远程会话服务器。

·可以在安全约束的环境中工作

·编译器是一个小于150K的jar文件

三、BeanShell Sampler的使用

Jmeter中的BeanShell主要有:定时器BeanShell Timer、前置处理器BeanShell PreProcessor、采样器BeanShell Sampler、、后置处理器BeanShell PostProcessor、断言BeanShell、断言监听器BeanShell Listener。

下面以BeanShell Smapler为例介绍BeanShell的用法,其他的BeanShell使用方法可以用此举一反三。

(一)BeanShell Sampler创建

首先创建一个线程组

创建成功线程组后,在线程组中创建一个BeanShell Sampler。

创建成功的BeanShell Sampler如下图所示,创建成功之后可以在其中编写BeanShell脚本。

(二)获取时间戳

在Jmeter中,可以利用${__time(,)}时间戳函数来获取十位的时间戳:

此处不填入具体的访问地址,仅关注时间戳函数的使用。

使用${__time(yyyy-MM-dd-HH-mm-ss,)}可以获得yyyy-MM-dd-HH-mm-ss格式的十位的时间戳,结果如下图:

但是在具体使用中,有时候需要传送较为复杂的时间格式,如“2016-07-31T21:24:07.581Z”此时不能直接调用time函数,因此可以利用BeanShell获取当前时间。

此处运用了内置对象vars对变量进行存取操作:

·vars.get("name"):从jmeter中获得变量值

·vars.put("key","value"):数据存到jmeter变量中

若使用该程序段,在Jmeter中调用变量${str}可以获得yyyy-MM-ddTHH:mm:ss.SSSZ格式的时间,调用变量${str0}可以获得yyyy-MM-ddTHH:mm:ssZ格式的时间。

(三)BeanShell脚本使用的几种的不同的场景

以文件的读写为例,对BeanShell脚本的使用的几种不同的场景做了一个简单的总结

1. 自定义函数

在BeanShell中编写自定义函数,直接利用脚本编译器编译

程序段如下:

import java.io.BufferedReader;

import java.io.File;import java.io.FileReader;

import java.io.IOException;

import java.io.FileWriter;

import java.io.BufferedWriter;

File file = new File("D://apache-jmeter-2.13//Meclipper_case//Users_TestCase//email.txt");

BufferedReader reader = null;

String tempString = null;

String str;

int num;

String str3="";

String str2="";

try {

reader = new BufferedReader(new  FileReader(file));

tempString = reader.readLine();//tempString读文件

reader.close();

str=tempString.trim();//str取字符串

if(tempString!=null&&!"".equals(str)){

for(int i=0;i=48 && str.charAt(i)<=57){

str2+=str.charAt(i);//str2取数字字符

}

}

//System.out.println(str2);

num=Integer.parseInt(str2);//num转换str2为int型

//System.out.println(num);

num=num+1;

//System.out.println(num);

str3= String.valueOf(num)+"@qq.com";//str3转换int型为string

//System.out.println(str3+"@qq.com");

}

}

catch (IOException e) {

e.printStackTrace();

}

finally {

if (reader != null) {

try {

reader.close();

}

catch (IOException e1) {

}

}

}

//String str4=str3+"@qq.com";

//System.out.println("str4="+str4);

try{

//File file = new File("/users/mkyong/filename.txt");

// if file doesnt exists, then create it

if (!file.exists()) {

file.createNewFile();

}

FileWriter fw = new FileWriter(file.getAbsoluteFile());

BufferedWriter bw = new BufferedWriter(fw);

bw.write(str3);

bw.close();

}catch(IOException e){

e.printStackTrace();

}

vars.put("emailtxt",str3);

其中将读取出的文件中的内容,同时写入文件,并利用内置函数vars.put("emailtxt",str3);将内容赋予变量${emailtxt},在jmeter中就能够调用该变量。在该程序中,存了以数字命名的email,如“110@qq.com”,利用读写文件,将email名+1,并使用该email进行注册。

在线程组中调用该变量:

Jmeter发送的email请求运行结果如下:

2. 调用外部java文件

如果我们已经有现成的java源文件,可以在BeanShell中直接编写和java引用外部文件时一样的语句来调用java外部文件。

还是之前读写文件的源程序,首先在eclipse中创建完整的工程,并在其中中编写相应的代码,需要注意的是引用的外部文件的返回值。

代码段如下所示:

其次,找到.java源文件的路径:

在BeanShell中引用该路径下的java源文件

3. 导入外部jar包

从上面两个场景可以知道,在BeanShell中引用外部文件和java是一样一样的,因此此处就不进行过多的描述,步骤为:

·在eclipse写好代码,然后把该类打成jar包(在类上点击右键->Export->jar file)

·把jar包放到jmeter目录\apache-jmeter-2.13\lib\ext下

·打开jmeter,添加一个http sampler,在sampler下添加一个BeanShell Sampler

·在BeanShell中的头文件中导入该jar包,例import testmail.src.hyq.utils.*

Jmeter-BeanShell的使用介绍的更多相关文章

  1. jmeter BeanShell实例-----两个变量之间的断言对比

    jmeter BeanShell实例-----两个变量之间的断言对比 在jmeter的中,断言没法对两个变量的进行对比后判断,只能使用Bean Shell断言来进行,总是有人来问怎么写呢.这里写一个简 ...

  2. JMeter学习工具简单介绍

    JMeter学习工具简单介绍   一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态 ...

  3. (jmeter内置可调用的变量)jmeter beanShell断言

    用户可以在jmeter- “beanShell断言”中自定义断言.自由灵活的用脚本实现自己的断言  beanShell断言接口介绍  在beanShell中直接可以调用的变量,无需加前缀.  1.lo ...

  4. jmeter BeanShell实例-----两个变量之间的断言对比(转)

    jmeter BeanShell实例-----两个变量之间的断言对比 在jmeter的中,断言没法对两个变量的进行对比后判断,只能使用Bean Shell断言来进行,总是有人来问怎么写呢.这里写一个简 ...

  5. Jmeter Beanshell 编程简介

    简介 Jmeter除了提供丰富的组件以外,还提供脚本支持,可通过编写脚本来丰富Jmeter,实现普通组件无法完成的功能.Beanshell是一种轻量级的Java脚本语言,完全符合Java规范,并且内置 ...

  6. JMeter性能监测插件介绍(三)

    JMeter 性能监测插件介绍 压力测试过程中,能够随时对负载服务器的健康状况的把控是相当重要的,有了这些数据,我们才能准确分析出服务器负载瓶颈.JMeter 插件包现在能够支持服务器监控,可以在所有 ...

  7. jmeter基本组成原件介绍

    jmeter基本组成原件介绍 参考地址:https://wenku.baidu.com/view/d4986ca2aaea998fcc220ec1.html 从性能工具的原理划分: Jmeter工具和 ...

  8. Jmeter 结构、原理介绍

    Jmeter结构.原理介绍 一.Jmeter 简介 1.是基于java语言的开源的应用软件. 2.可以进行接口测试.性能测试.接口及性能的自动化测试. 二.Jmeter体系结构 元件:可以理解为每一个 ...

  9. jmeter beanshell

    //获取返回数据 String json = prev.getResponseDataAsString(); ///加入变量vars.put("restr",json); //获取 ...

  10. Testing Complex Logic with JMeter Beanshell

    BeanShell是最先进的JMeter内置组件之一.JMeter具有丰富的内置插件,可满足性能测试的许多需求.例如,在编写一些复杂的测试时,您可能需要一些额外的脚本.在这种情况下,值得使用Beans ...

随机推荐

  1. LeetCode Construct String from Binary Tree

    原题链接在这里:https://leetcode.com/problems/construct-string-from-binary-tree/#/description 题目: You need t ...

  2. nodejs 不同请求获取前端传的参数

    get方法 参数在req.query中获取 router.get('/', function(req, res, next) { console.log("reqquery:",r ...

  3. 学习动态性能表(6)--v$session_wait&v$session_event

    学习动态性能表 第六篇-(1)-V$SESSION_WAIT  2007.5.30 这是一个寻找性能瓶颈的关键视图.它提供了任何情况下session在数据库中当前正在等待什么(如果session当前什 ...

  4. PHP数组编码转换

    因为一些特殊字符的显示效果的原因不得不把习惯的utf-8工程改成了GBK,由于使用了ajax技术,又涉及到了老问题——编码转换. 一些表单验证需要返回json数据,php的json_encode函数只 ...

  5. oracle如何查看表空间

    1.用户 查看当前用户的缺省表空间 SQL>select username,default_tablespace from user_users; 查看当前用户的角色 SQL>select ...

  6. Java基础--HashCode

    如果一个类的对象要用做hashMap的key,那么一定要注意覆盖该类的equals和hashCode方法. equals()是基类Object的方法,用于判断对象是否有相同地址及是否为同一对象 pub ...

  7. WebDriver数据驱动模式

    利用@dataprovider 在一个浏览器内多次登录不同的用户时,必须要每次完成一个登录后,都有一个退出登录的代码,以保持和初始登录页面一致,才不会报错并再次循环登录

  8. 获取APK的package名和activity名

    使用 aapt dump badging + 需要安装的APK

  9. Zookeeper学习(八):Zookeeper的数据发布与订阅模式

     http://blog.csdn.net/ZuoAnYinXiang/article/category/6104448 1.发布订阅的基本概念        1.发布订阅模式可以看成一对多的关系:多 ...

  10. C# 保存文件如有重名在原名后加(*)

    C#保存文件如有重名加() **(1) //Myadd 处理重名 private string GetNewPathForDupes(string path) { string directory = ...