在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. Linux-3.14.12内存管理笔记【构建内存管理框架(2)】

    前面构建内存管理框架,已经将内存管理node节点设置完毕,接下来将是管理区和页面管理的构建.此处代码实现主要在于setup_arch()下的一处钩子:x86_init.paging.pagetable ...

  2. Pyhton 连接数据库

    Python连接MySql 步骤 开始 创建connection 获取cursor 操作过程 SQL语句 执行查询 执行命令 获取数据 处理数据 关闭游标:cursor.close() 关闭连接:co ...

  3. Git 在小团队中的管理流程

    目标读者:了解 Git 的基本概念,能够使用 Git 进行基本的本地和远程操作. 有关 Git 的基础知识可以参见 知乎回答-怎样使用 GitHub?,天猪(刘勇)给出了一些很好的学习资料. 本文介绍 ...

  4. 华硕飞行堡垒_安装kali后N卡问题

      问题来源: 因业务需要,最近打算安装kali linux操作系统,但是安装完成后开机过一会就会卡死,而且没办法进入用户的登录界面 问题分析: 笔记本电脑信息: 华硕飞行堡垒5 TUF GAMING ...

  5. spring mongodb用法

    A field annotated with @Id (org.springframework.data.annotation.Id) will be mapped to the '_id' fiel ...

  6. go语言设计模式之memento

    memento.go package memento import ( "fmt" ) type State struct { Description string } type ...

  7. python的路径问题

    ## 文件路径出错问题 """ 如何获取与当前文件相关的地址 """ import os # 当前文件的完整路径 print(__file_ ...

  8. react+dva 全局model中异步获取数据state在组件中取不到值

    先上结论,不是取不到,是写法有问题. 全文分4部分,1是问题描述,2是一开始的解决想法(错误做法),3是问题产生原因的思考,4是正常解决方法.只想看结论直接跳4 1.问题描述 接触react dva一 ...

  9. Python连载53-UDP、TCP、FTP编程实例

    一.服务器程序要求永远运行,一般用死循环来处理 1.服务器改造版本V03(主程序 原封不动,这里只修改了运行的程序) if __name__ == "__main__": whil ...

  10. SpringBoot系列之配置文件占位符使用

    SpringBoot系列之配置文件占位符使用 Springboot占位符支持的有随机数和配置的值等等,本博客主要介绍的是随机数和获取属性配置值的简单用法 随机数获取 支持的写法有: ${random. ...