在Jmeter中各种分类组件中都有相应的BeanShell组件,这里简单的说明一下Beanshell的使用。

一、概念

  BeanShell是一种符合Java语法的脚本语言,也有自己的一些特定语法

二、内置变量

  Jmeter在它的Beanshell中内置了变量,用户可以通过这些变量与Jmeter进行交互,其中主要的变量及使用方法如下:

1、log:

  在调试脚本的时候,可以将结果输出到日志,判断结果是否正确。使用log时会将日志信息保存到jmeter.log文件中,也可以打开log viewer实时查看日志信息。

  常用方法为:log.info("");

  注意在使用log.info输出信息的时候,如果变量的值是字符型,一定要在调用变量的时候,加双引号。

2、vars:

  操作jmeter变量,常用的方法有:

  (1、vars.get("变量名"):从jmeter变量中获取值;

  (2、vars.put("变量名",变量):将beanshell中的变量值,复制给Jmeter变量,在Jmeter的后续使用中可以通过变量名调用。

3、prev:

  获取前一个取样器的返回值,常用的方法有:

  (1、getResponseDataAsString():获取前一个取样器的响应信息;

  (2、getResponseCode():获取前一个取样器的响应Code;

4、其他的变量ctx和props(操作属性)

BeanShell断言:

用户可以在jmeter- “beanShell断言”中自定义断言。自由灵活的用脚本实现自己的断言
beanShell断言接口介绍
在beanShell中直接可以调用的变量,无需加前缀。
1.log 打印日志 log.info(“在控制台打印日志”);
2.SampleResult 获取SampleResult对象,可以通过这个对象获取想要的信息
3.Response 获取Response对象,可以通过这个对象获取对应的信息
4.Failure 查看接口调用是否成功,如果返回false是成功的,true是失败的
5.FailureMessage 失败信息,没有设置的时候失败信息是空的。可以set这个信息
6.ResponseData 获取 response body,类型是byte[]
7.ResponseCode 返回接口code,成功是200
8.ResponseMessage 获取msg,成功是OK
9.ResponseHeaders 获取接口服务端返回的头部信息
10.RequestHeaders 获取客户端请求的头部信息
11.SampleLabel 获取接口请求的名称
12.SamplerData 获取请求的url和body
13.ctx 代表上下文信息,可以直接使用
14.vars 可以直接调用,将获取的数据变成jmeter变量(put),也可以获取用户自定义的变量(get)
eg:
1.在http sample下添加一个beanShell断言
2.编写script
import org.apache.jmeter.assertions;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.assertions.AssertionResult;
import org.json.*; String response_data = prev.getResponseDataAsString();//获取接口返回的response数据
JSONObject data_obj = new JSONObject(response_data);//转换成json
//判断code是否等于0 如果等于0 再取里面的字段
String code = data_obj.get(“code”);
if(code.equals(“0”))
{
String user_name = data_obj.get(“data”).get(“user”).get(“userName”).toString();
//这里的my_name 是用户自定义的变量或者之前的接口返回获取的
if(user_name.equals(${my_name})){
Failure = false; //设置成false 表示接口跑成功,在结果树中sample是绿色的
//做后续动作
…….
}
else{
//做其他动作
}
}
else
{
Failure = true;//直接判断失败,表示接口跑失败,在结果树中sample是红色的
prev.setStopThread(true);//如果断言失败,后面的接口不需要再跑,直接暂停
}

三、一些简单的使用

1、BeanShell响应断言

  因为用到了Json.jar(json-20180813.jar),所以需要先将json.jar导入。

2、BeanShell Sampler

例:

import org.json.*;
String response_data=prev.getResponseDataAsString();
log.info("交易返回:"+response_data);
JSONObject data_obj = new JSONObject(response_data);
String code = data_obj.get("respCode").toString();
log.info("code:"+code);
if(code.equals("R200")){
log.info("交易成功");
FileWriter fstream = new FileWriter("D:\\apache-jmeter-3.3\\bin\\result\\idtxn_R200.csv",true);
BufferedWriter out = new BufferedWriter(fstream);
out.write(vars.get("idTxn")+"\n");
out.close();
fstream.close();
Failure = false;//设置成false 表示接口跑成功,在结果树中sample是绿色的
}else if(code.equals("R998")){
log.info("交易失败");
FileWriter fstream = new FileWriter("D:\\apache-jmeter-3.3\\bin\\result\\idtxn_R998.csv",true);
BufferedWriter out = new BufferedWriter(fstream);
out.write(vars.get("idTxn")+"\n");
out.close();
fstream.close();
Failure = true;
}

对上面例子进行优化:

1.对写文件操作,添加公共方法,并使用相对路径,增加代码可移植性

import org.json.*;
source("\\java\\RecordIdTxn.java");//java文件放在bin目录下,可以使用相对路径,增加代码可移植性
vars.put("resultPath",System.getProperty("user.dir")+"\\result");//在bin目录下新建一个result目录,用于存放执行结果记录
log.info("获取相对路劲:"+"${resultPath}");
String response_data=prev.getResponseDataAsString();
log.info("交易返回:"+response_data);
JSONObject data_obj = new JSONObject(response_data);
String code = data_obj.get("respCode").toString();
log.info("code:"+code);
if(code.equals("R200")){
log.info("交易成功");
//FileWriter fstream = new FileWriter("D:\\apache-jmeter-3.3\\bin\\result\\idtxn_R200.csv",true);
//BufferedWriter out = new BufferedWriter(fstream);
//out.write(vars.get("idTxn")+"\n");
//out.close();
//fstream.close();
RecordIdTxn("D:\\apache-jmeter-3.3\\bin\\result\\idtxn_R200.csv");//如果没有idtxn_R200.csv文件,会自动生成该文件
Failure = false;//设置成false 表示接口跑成功,在结果树中sample是绿色的
}else if(code.equals("R998")){
log.info("mcs system error...");
RecordIdTxn("D:\\apache-jmeter-3.3\\bin\\result\\idtxn_R998.csv");
Failure = true;
}else{
log.info("其他异常");
RecordIdTxn("D:\\apache-jmeter-3.3\\bin\\result\\idtxn_other.csv");
Failure=true;
}

Jmeter之BeanShell的更多相关文章

  1. JMeter中BeanShell实现写入文件

    1.首先F:\test.txt文件为空

  2. jmeter之beanshell提取json数据

    Jmeter BeanShell PostProcessor提取json数据 假设现有需求: 提取sample返回json数据中所有name字段对应的值,返回的json格式如下: {“body”:{“ ...

  3. jmeter通过BeanShell 脚本,实现对http请求参数的加密

    jmeter一直是一款很好的接口和性能测试工具,它是开源的,不需要为此支付任何费用,而且可以下载源码,可以在修改源代码并在此基础上拓展自己的功能或插件,它可以跟ant和jenkins结合起来搭建自己的 ...

  4. JMeter中BeanShell的实际应用

    使用Jmeter的BeanShell断言,把响应数据中的JSON跟数据库中的记录对比 很多时候我们需要把Response Data取到的 Json 字符串跟数据库里的对比,来验证接口的正确性,使用Be ...

  5. jmeter之beanshell取出需要参数,传递给下个请求

    jmeter之beanshell取出需要参数,传递给下个请求 事件背景: 上周同事用jmeter录制脚本,录制成功回放后,并没有达到自己想要的结果. ps:他想从数据库取出某个字段值,然后对数据库做操 ...

  6. jmeter用BeanShell调用jar包对HTTP请求中的参数进行MD5加密

    前提: eclipse.JDK.Jmeter 说明: 本文分为两部分进行配置说明 第一部分:编写JavaMD5加密脚本 第二部分:使用Jmeter的BeanShell进行验证 ************ ...

  7. 利用JMeter的beanshell进行接口的加密处理

    最近项目中在做http协议的接口测试,其中接口请求报文数据有个字段值需要用到加密后的签名,即出于网络传输过程中,对数据安全的考虑,要对请求的数据进行特定的处理(加密),再进行请求. 刚开始由于项目赶进 ...

  8. Jmeter用BeanShell Sampler调用java写的jar包进行MD5加密

    [前言] 在工作中,有时候我们请求的参数可能需要加密,比如登录接口中的密码做了加密操作,今天我就给大家介绍一种方法:Jmeter用BeanShell Sampler调用java写的jar包进行MD5加 ...

  9. JMeter(5) JMeter之BeanShell使用

    BeanShell介绍 BeanShell是用Java写成的,一个小型的.免费的.可以下载的.嵌入式的Java源代码解释器,具有对象脚本语言特性.本篇只记录一下基本的使用.有以下五个组件: Beans ...

  10. jmeter通过BeanShell,实现对接口参数HmacSHA256加密(转)

    jmeter通过BeanShell,实现对接口参数HmacSHA256加密2019-04-29 05:10 ps. 最近抓包网站的登陆请求,发现就2个参数,用户名和密码,通过工具去请求这个接口,一直返 ...

随机推荐

  1. android 获得一些设备信息的静态函数

    1.Brand,IMEI,DeviceOS,DeviceFactoryTime public static String getDeviceBrand(Context context) { Strin ...

  2. Python-1-Day

    C = float(input("Enter a degree in Celsius:"))F = (9/5) * C + 32print("{0} Celsius is ...

  3. 不相交集ADT 你是和谁是一类人?

    //不相交集ADT (抽象数据类型) //一般用于集合运算 //用树,这种结构组成,有多个树(=森林) //属于同一颗数的元素,表示处于同一个集合中 //主要支持2个操作. //1. Find操作,找 ...

  4. go语言设计模式之visitor

    这个确实没有调通,也要记录一下 visitor.go package visitor import ( "fmt" "io" "os" ) ...

  5. Codeforces Round #606 (Div. 2)

    传送门 A. Happy Birthday, Polycarp! 签到. Code /* * Author: heyuhhh * Created Time: 2019/12/14 19:07:57 * ...

  6. 初学Python之爬虫的简单入门

    初学Python之爬虫的简单入门 一.什么是爬虫? 1.简单介绍爬虫   爬虫的全称为网络爬虫,简称爬虫,别名有网络机器人,网络蜘蛛等等. 网络爬虫是一种自动获取网页内容的程序,为搜索引擎提供了重要的 ...

  7. 基于Django的Rest Framework框架的分页组件

    本文目录 一 简单分页(查看第n页,每页显示n条) 二 偏移分页(在第n个位置,向后查看n条数据) 三 CursorPagination(加密分页,只能看上一页和下一页,速度快) 回到目录 一 简单分 ...

  8. HTML连载44-标准排版、浮动排版

    一.什么网页的布局方式? 网页的布局方式其实就是指浏览器是如何对网页的元素进行排版的 二.标准流排版方式(又称为文档流.普通流) 1.含义 其实浏览器默认的排版方式就是标准流排版方式 2.在CSS中将 ...

  9. 游戏设计模式——Unity事件队列(纪念京阿尼事件)

    “对消息或事件的发送与受理进行时间上的解耦.” 在游戏开发过程中,经常会出现不同板块之间的信息交流,或是存在“当...,就...”的情况,事件队列编程模式可以有效解决消息传递中产生的脚本耦合问题,让同 ...

  10. GO Map的初步使用

    一.集合(Map) 1.1 什么是Map 张三:13910101201 李四:13801010134 map是Go中的内置类型,它将一个值与一个键关联起来.可以使用相应的键检索值. Map 是一种无序 ...