jmeter学习记录–05–Beanshell2

学习beanshell时有不少的例子、遇到不少问题。在此记录下。

测试实例列表

A1:使用Beanshell请求作为测试请求

一个打包的Jar包,直接对其内的方法进行测试。

第一步:将接口jar包要放到%JMETER_HOME%\lib目录

第二步:编写请求。

A2:共享线程变量

JMeter中线程间共享变量可以通过定义属性值来完成,JMeter启动时会读取一些属性文件,比如jmeter.properties、user.properties,这些属性值是可以增加的,也可以修改的,通过BeanShell可以对其进行更改。

定义变量:以BeanShell Sampler为例,在其中通过props.put()来增加属性,props.get()来获取属性。如:props.put(“param_a”,”root”);

使用变量:在后续请求如Java请求中通过 ${__property(【属性名称】,,)}来获取。如:${__property(param_a,,)} 来使用。

示例:

在线程组1中使用__setProperty定义属性值(全局变量),将所需变量值${param_A}设置为属性值。

String token = bsh.args[0];//输入值为assfd
//第一种写法,测试时token与${token}两种写法都无法调用变量
${__setProperty(param_A,${token},)};
//第二种写法
props.put("param_B",token);

debug请求中,打开属性与变量。查看结果树中, 属性值结果为:

param_A=${token}

param_B=assfd

在线程组2,beanshell中输入

${__property(param_A,GROUP2_A,)};
${__property(param_B,GROUP2_B,)};

debug请求中,打开属性与变量。查看结果树中, 变量值结果为:

GROUP2_A=${token}
GROUP2_B=assfd

疑问:1)${__setProperty(param_A,token,)}; 这里token是变量,但是实际是将这个字符串拷贝存到param_A属性里的了。换成${token}也是如此。

2)props.put添加的属性值,不会写到jmeter.properties文件里,只在当前测试计划中生效。比如当前加了一个属性A,执行过后在当前测试计划中会一直存在,即使beanshell文件中已无这个属性值的定义也是如此。重新打开一个测试计划,属性A就不存在了。

A3:使用 BeanShell 断言判断用例成功与否

用beanshell做断言结果判断

jmeter学习记录--05--Beanshell2jmeter学习记录--05--Beanshell2
log.info(SampleResult.getResponseDataAsString());

boolean result = false;

String uid = vars.get("uid");
String token = vars.get("token");

if (SampleResult.getResponseCode().equals("200") && token.contains(uid)) {
    result = true;
} else {
    result = false;
}
SampleResult.setSuccessful(result);

View Code

http://www.cnblogs.com/xxyBlogs/p/5966194.html

A4:处理请求或结果,如对base64加解密,URL转码等 (jmeter 3.2)

base64加解密,使用函数助手中的两个函数。

在beanshell中添加

//加密,encode为加密后字符串变量
${__base64Encode("haishizi",encode)};
//解密,对加密胡变量做解密处理
${__base64Decode(${encode},decode)};

debug sampler对应测试结果为:

decode= “haishizi”
encode=ImhhaXNoaXppIg==

如果加密函数中${__base64Encode(“haishizi”,encode)};修改为${__base64Encode(haishizi,encode)};

对应测试结果为:

decode= haishizi
encode=aGFpc2hpemk=

A5:自定义时间格式Jmeter-BeanShell的使用介绍

普通方式 获取时间戳

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

{
“time”:”${__time(yyyy-MM-dd-HH-mm-ss,)}”
}

jmeter学习记录--05--Beanshell2

直接执行后,在”查看结果树”中显示的是:

jmeter学习记录--05--Beanshell2

BeanShell自定义

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

jmeter学习记录--05--Beanshell2jmeter学习记录--05--Beanshell2
import java.util.*;
import java.text.SimpleDateFormat;

String str1 = (new SimpleDateFormat("yyyy-MM-dd")).format(new Date());
String str2 = (new SimpleDateFormat("HH:mm:ss.SSS")).format(new Date());
String str3 = (new SimpleDateFormat("HH:mm:ss")).format(new Date());

vars.put("str_A",str1+"T"+str2+"2");
vars.put("str_B",str1+"T"+str3+".000"+"2");

log.info("\n"+str_A);//直接获取不生效,日志打印为void
log.info("\n"+${str_A});//直接获取不生效,日志打印为空

View Code

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

http请求中输入,选择post方法。

{
"time":"${__time(yyyy-MM-dd-HH-mm-ss,)}"
"time2":${str_A}
"time3":${str_B}
"time4":${str1}
}

查看结果树中结果为:

POST data:
{
“time”:”2017-07-26-18-23-56″
“time2”:2017-07-26T18:23:56.8692
“time3”:2017-07-26T18:23:56.0002
“time4”:${str1}
}

疑问:为何str1字符串直接日志输出或使用变量不可以,将其转化为内置变量就可正常使用?

A6:把测试结果放到一个excel文件中

jmeter学习记录--05--Beanshell2jmeter学习记录--05--Beanshell2
FileWriter fstream = new FileWriter("d:\\a.csv",true);
BufferedWriter out = new BufferedWriter(fstream);
out.write("uid"+","+vars.get("uid")+",");
out.write("mobileNumber"+","+vars.get("mobileNumber")+",");
out.write("inviteCode"+","+vars.get("inviteCode")+",");
out.write("\n");

//out.write(vars.get("inviteCode"));
//out.write(System.getProperty("line.separator"));
out.close();
fstream.close();

View Code

A7: 对redis的操作

jmeter学习记录--05--Beanshell2jmeter学习记录--05--Beanshell2
import redis.clients.jedis.Jedis;
    try{
          Jedis jedis = new Jedis("${host}",${port},10000);
        if (jedis != null) {
            System.out.println("connect to redis server sucessfully");
        }
        String hostCount = jedis.get("api_index_ACount");
        String videoCount = jedis.get("api_index_BCount");
        System.out.println(ACount);
        System.out.println(BCount);
        vars.put("hostCount",ACount);
        vars.put("videoCount",BCount);
       jedis.close();
       }
      catch(Exception e){
         System.out.println(e);
       }

sampler 请求

jmeter学习记录--05--Beanshell2jmeter学习记录--05--Beanshell2
import redis.clients.jedis.Jedis;

Jedis jedis = new Jedis("${host}",${port},10000);
String ACount = jedis.get("api_index_ACount");
String BCount = jedis.get("api_index_BCount");

jedis.close();
String response_data = prev.getResponseDataAsString();

if(response_data.contains(ACount)&&response_data.contains(BCount)){
    FailureMessage="success";
    }
else{
    Failure=true;
    FailureMessage="fail:"+ACount+""+BCount;
    }

断言

问题列表

Q1:自定义函数的变量赋值时报错(jmeter 3.2)—未解决

变量定义有3种情况:

第一种:param_A,直接通过vars.put来定义参数值;

第二种:param_B,通过bsh.args[0]获取到传入的参数值123,将其赋值。

第三种:通过函数变量来实现,将字符串abc变量的值赋值给unique_id。

jmeter学习记录--05--Beanshell2
jmeter学习记录--05--Beanshell2jmeter学习记录--05--Beanshell2
import java.util.UUID;

vars.put("param_A","123456");
vars.put("param_B",bsh.args[0]);

UUID uuid1 = UUID.randomUUID();
String abc = uuid1.toString();
vars.put("unique_id",abc);

log.info("\n_abc_value:"+abc);
log.info("\n unique_id value:"+${unique_id});

beanshell变量定义

jmeter学习记录--05--Beanshell2
jmeter学习记录--05--Beanshell2jmeter学习记录--05--Beanshell2
result = "\n"+"param_A:"+bsh.args[0]+"\n"; //1:从参数框中获取参数变量,不适用
result += "param_B:"+bsh.args[1]+"\n";
result += "unique_id:"+bsh.args[2]+"\n";

ResponseCode = 500;//回写请求响应代码,借鉴的http响应码
ResponseMessage = "test ok!!";//回写响应信息
IsSuccess = true;//回写响应结果

log.info("\nlog test:"+result);//调用jmeter内置log对象,日志会打印到jmeter.log中
SampleResult.setResponseData("SampleResult:"+result+"\n");//回写响应数据,SampleResult为jmeter内置回写结果对象,有很多可用方法,可以参看源码
return "return:"+result;

beanshell使用变量

jmeter学习记录--05--Beanshell2

{unique_id}值并未取实际的参数值。看log日志:

jmeter学习记录--05--Beanshell2

2017-07-12 09:00:53,939 ERROR o.a.j.u.BeanShellI nterpreter: Error invoking bsh method: eval Sourced file: inline evaluation of: java.util.UUID; vars.put(“param_A”,”123456″); vars.put(“param_B”,bsh.arg . . . ” : Attempt to access property on undefined variable or class name

可看到abc字符串取值还是正常的,但是将其赋值unique_id后报错。

vars:即JMeterVariables,操作jmeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),常用方法:

a) vars.get(String key):从jmeter中获得变量值

b) vars.put(String key,String value):只能用String类型的参数,数据存到jmeter变量中,其作用可简单理解为赋值操作:key=value,更多方法可参考:org.apache.jmeter.threads.JMeterVariables

Q2:hashmap这类的,同样的脚本在ecplise里运行正常,在beanshell中报错 (jmeter3.3 测试时)

最终的原因为Map方法中不能指定数据类型,List中同理。

Map

其中有这行代码时总会提示:
2019-01-30 16:04:54,702 ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval In file: inline evaluation of: org.apache.commons.codec.digest.DigestUtils; //导入md5加密的包 import java. . . . ” Encountered “,” at line 12, column 11.

2019-01-30 16:04:54,702 WARN o.a.j.p.j.s.BeanShellSampler: Exception executing script. org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval In file: inline evaluation of: org.apache.commons.codec.digest.DigestUtils; //导入md5加密的包 import java. . . . ” Encountered “,” at line 12, column 11.

将这行修改为:Map paramMap = new HashMap(); 后解决

后续用put方法将信息存到paramMap中。但是如果引入的jar中有代码也是使用的map传参,而beanshell中如果调用这个方法时也会报错。

beanshell调用:String sign = MD5Util.proSign(paramMap,secret);jar包中源码:
public String proSign(Map params, String secret)报错:
2019-01-30 16:38:53,914 ERROR o.a.j.u.BeanShellInterpreter: Error invoking bsh method: eval    Sourced file: inline evaluation of:  com.chain.*;  import java.util.Map; import java.util.HashMap; import java . . . '' : Typed variable declaration : Cannot reach instance method: proSign( java.util.Map, java.lang.String ) from static context: com.test.MD5Util
2019-01-30 16:38:53,914 WARN o.a.j.p.j.s.BeanShellSampler: Exception executing script. org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval    Sourced file: inline evaluation of:  com.test.*; '' : Typed variable declaration : Cannot reach instance method: proSign( java.util.Map, java.lang.String ) from static context: com.test.MD5Util

这种调用方式,没有解决。用其他方式暂时规避了。

参考:

https://www.cnblogs.com/linbo3168/p/9288926.html

https://blog.csdn.net/qq_35304570/article/details/80858494

待续。。。。。。。。。。。。。。。

Original: https://www.cnblogs.com/kongzhongqijing/p/7153752.html
Author: milkty
Title: jmeter学习记录–05–Beanshell2

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/529645/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Python环境安装

    一、下载地址: Python:Download Python | Python.org PyCharm:Download PyCharm: Python IDE for Profe…

    Linux 2023年6月13日
    0100
  • MSYS2使用记录——win10系统64位安装msys2最新版(msys2-x86_64-20190524.exe)

    MSYS2使用记录——win10系统64位安装msys2最新版(msys2-x86_64-20190524.exe) 安装 测试系统: windows 10 首先需要msys2的安…

    Linux 2023年6月13日
    089
  • 画图3D Paint 3D工作区黑屏

    最近不知道画图3D抽什么风,黑屏了。 后来研究很久,发现这货竟然是用独立显卡,集显带不起来。 解决方案是在Nvidia控制面板给他分配独立显卡,不要使用集显,不要使用集显,不要使用…

    Linux 2023年6月13日
    0100
  • LeetCode-26. 删除有序数组中的重复项

    题目来源 题目详情 由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应…

    Linux 2023年6月7日
    087
  • Java动态脚本Groovy,高级啊!

    前言:请各大网友尊重本人原创知识分享,谨记本人博客: 南国以南i 简介: Groovy是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编…

    Linux 2023年6月14日
    0128
  • 翻车!误删/usr/lib/引发的血案,从棺材边成功抢救的过程分享。

    写在开篇 血案:本地开发机是CentOS 7,本想删除在/usr/lib/下的一个软链,如:/usr/lib/xxx。当正想删除时,突然被别的事情打扰了一下,回过神之后莫名奇妙的执…

    Linux 2023年6月7日
    093
  • 爱前端公开课学习笔记——JS01 认识js 变量

    认识js 在谷歌浏览器的控制台中右键单击空白处,选择检查可以打开控制台 查看console.log输出的内容。 JS的注释 是”//”或者”/ …

    Linux 2023年6月14日
    090
  • DNS 查询原理详解

    你可能会问,难道 DNS 服务器(比如 1.1.1.1)保存了世界上所有域名(包括二级域名、三级域名)的 IP 地址? 当然不是。DNS 是一个分布式系统,1.1.1.1 只是用户…

    Linux 2023年6月8日
    058
  • JuiceFS v1.0 beta3 发布,支持 etcd、Amazon MemoryDB、Redis Cluster

    JuiceFS v1.0 beta3 在元数据引擎方面继续增强,新增 etcd 支持小于 200 万文件的使用场景,相比 Redis 可以提供更好的可用性和安全性。同时支持了 Am…

    Linux 2023年6月14日
    098
  • Centons7最小化安装报错:ping: baidu.com: Name or service not know

    在这之前,centos7最小化安装默认是不能联网的,首先必须切换到root用户,再解决网络问题 一、 切换到root用户 二、 解决网络问题 一、切换到root用户 Linux下切…

    Linux 2023年6月7日
    0148
  • 构建自定义镜像并优化dockerfile文件

    服务器版本 docker软件版本 CPU架构 CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 x86_64…

    Linux 2023年6月7日
    084
  • RPA 快手自动上传机器人

    bash;gutter:true;1、打开账号Cookie预存表格2、机器人自动登录账号3、机器人开始按照预设视频位置开始自动上传视频4、机器人开始自动填写视频相关信息内容5、完成…

    Linux 2023年6月7日
    0112
  • 缓存提升性能的关键性手段

    提高「性能」的主要方式是优化,而优化的其中一个主要手段就是添加缓存! 在软件工程里有这么一句话:「没有银弹」!就是说由于软件工程的复杂性,没有任何一种技术或方法能解决所有问题!软件…

    Linux 2023年6月14日
    085
  • 方法的深度理解

    权限修饰符 返回值类型 类名(行参列表 )throws 异常的类型{ //方法体 约定俗称:子类中叫重写的方法,父类中叫被重写的方法。 ①子类重写的方法名和行参列表和父类被重写的方…

    Linux 2023年6月14日
    088
  • flask 之上传本地图片

    项目配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import os class Config(object): DEBUG = True SQLALCH…

    Linux 2023年6月8日
    093
  • 真香警告!JitPack 开源库集成平台

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 简介 官方介绍: JitPack 是一个用于 JVM 和 Android 项目的新颖的包存储库。它按需构建 Git…

    Linux 2023年6月14日
    0106
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球