• 13
  • 13
分享
  • 你需要的jmeter常用Beanshell脚本,还不看一——软件测试圈
  • 饭团🍙 2021-01-06 11:18:09 字数 8381 阅读 3163 收藏 13

前言:这篇文章主要向大家介绍jmeter经常使用的Beanshell脚本,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

1、利用jmeter自带函数获取系统当前时间

//当前时间
${__timeShift(,,,,)}
//增加一天
${__timeShift(,,P1d,,)}
//增加七天时间格式化
${__timeShift(yyyy-MM-dd,,P7d,,)}
//减少七天时间格式化
${__timeShift(yyyy-MM-dd,,-P20d,,)}
//当前时间时间格式化
${__timeShift(yyyy-MM-dd,,,,)}
//增加一H ${__timeShift(,,PT1H,,)}
${__timeShift(yyyy-MM-dd HH:mm:ss:SSS,,,,)}
${__timeShift(yyyy-MM-dd HH:mm:ss:SSS,,P1d,,)}
${__timeShift(yyyy-MM-dd HH:mm:ss:SSS,,PT1H,,)}
${__timeShift(yyyy-MM-dd HH:mm:ss:SSS,,PT10m,,)}
${__timeShift(yyyy-MM-dd HH:mm:ss:SSS,,PT20S,,)}
${__timeShift(yyyy-MM-dd HH:mm:ss:SSS,,P1dT1H10m20s,,)}
${__time(YMDHMS,)}
${__time(YYYYMMDHMS,)}

2、手写java获取系统当前时间

package com.eric.excel;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @author Liweniang on 2019/10/22.
 * @version 1.0
 */SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); //设置时间格式
 
 //今天 
 Calendar cal=Calendar.getInstance();
 Date d= new Date();
 String s= sdf.format(d);    //格式化
 vars.put("current_date", s);
 
 //昨天
 Calendar cal0=Calendar.getInstance();
 cal0.setTime(d);
 cal0.add(Calendar.DATE, -1); // 日  +是往后推 -是向前推
 t1=cal0.getTime();
 String s1= sdf.format(t1);    //格式化
 vars.put("Yesterday_time", s1);
 
 //一年前
 Calendar cal1=Calendar.getInstance();
 cal1.setTime(d);
 cal1.add(Calendar.MONTH, -12); // 月份 +是往后推 -是向前推
 t2=cal1.getTime();
 String s2= sdf.format(t2);    //格式化
 vars.put("One_Year_Ago", s2);

  //一年零一天前
  Calendar cal2=Calendar.getInstance();
  cal2.setTime(d);
  cal2.add(Calendar.MONTH, -12); // 月份 +是往后推 -是向前推
  cal2.add(Calendar.DATE, -1); // 日  +是往后推 -是向前推
  t3=cal2.getTime();
  String s3= sdf.format(t3);    //格式化
  vars.put("One_Year_Ago_beforeoneday", s3);
 
 //1个月前
 Calendar cal3=Calendar.getInstance();
 cal3.setTime(d);
 cal3.add(Calendar.MONTH, -1); // 月份 +是往后推 -是向前推
 t4=cal3.getTime();String s4= sdf.format(t4);    //格式化
 vars.put("one_month_old", s4);
 
 //18个月零一天前
 Calendar cal4=Calendar.getInstance();
 cal4.setTime(d);
 cal4.add(Calendar.MONTH, -18); // 月份 +是往后推 -是向前推
 cal4.add(Calendar.DATE, -1); // 日  +是往后推 -是向前推
 t5=cal4.getTime();String s5= sdf.format(t5);    //格式化
 vars.put("Eighteen_Month_Ago_beforeoneday", s5);
 
 //一年前1个月
 Calendar cal5=Calendar.getInstance();
 cal5.setTime(d);
 cal5.add(Calendar.MONTH, -13); // 月份 +是往后推 -是向前推
 t6=cal5.getTime();String s6= sdf.format(t6);    //格式化
 vars.put("One_month_a_year_ago", s6);

3、获取时间戳

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
try{
Date date =new Date(); //获取当前时间
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String nowDate = sf.format(date);
Calendar cal = Calendar.getInstance();
cal.setTime(sf.parse(nowDate));
cal.add(Calendar.DAY_OF_YEAR,+0); 
String orderDate = sf.format(cal.getTime());
cal.add(Calendar.DAY_OF_YEAR,+365); 
String senderDate = sf.format(cal.getTime());
vars.put("orderDate",orderDate); //参数能够调用
vars.put("senderDate",senderDate); //参数能够调用
}
catch(Exception e){
}

4、下载文件

import  java.io.*;
byte [] result = prev.getResponseData(); 
String file_name =  "存放目录与文件名" ; 
File file =  new  File(file_name); 
FileOutputStream out =  new  FileOutputStream(file);
out.write(result);
out.close();

5、保存响应内容(如果响应内容为字符串数组,那需要转换成字符串)

FileWriter fstream =  new  FileWriter( "存放目录与文件名" , true );
BufferedWriter out = new  BufferedWriter(fstream);
out.write(vars.get( "需要保存的变量" )+ "," + vars.get( "需要保存的变量" ));
out.write(System.getProperty( "line.separator" ));
out.close();
fstream.close();

6、响应断言

import  java.io.UnsupportedEncodingException;
import  org.apache.jmeter.assertions.AssertionResult;import  org.json.*;
String str = prev.getResponseDataAsString();
String result =  "" ;
try  {
result = java.net.URLDecoder.decode(str,  "UTF-8" );
}  catch  (UnsupportedEncodingException e) {
e.printStackTrace();
}
JSONObject data_obj= new  JSONObject(str);
String result1 = data_obj.get( "dockedContact" ).get( "name" ).toString();
if (result1.contains( "zhufc" )) {
Failure =  true ;
FailureMessage =  "断言成功" ;
log.info( "断言成功" );
} else {
Failure =  false ;
FailureMessage =  "断言失败" ;
}

7、链接数据库

import  java.sql.*;
import  java.util.*;
import  java.lang.*;
import  org.apache.regexp.*;
import  org.json.*;
//一:数据库取值
String drive =  "org.gjt.mm.mysql.Driver" ;
String url =  "jdbc:mysql://192.168.204.129:3306/" ;
String dbName =  "aiopms" ;
String user =  "root" ;
String pass =  "000000" ;
String history =  "" ;
String response =  "" ;
String failuer =  "" ;
String query = "SELECT projectid From pms_projects Where name ='测试项目'  order by 'desc' limit 1" ;
Connection Mycon =  null ;
Statement Mystmt =  null ;
ResultSet Myrset =  null ;
try {
     Mycon = DriverManager.getConnection(url+dbName, user, pass);
     
         }    catch (SQLException e){
         
     }Mystmt = Mycon.createStatement();Myrset = Mystmt.executeQuery(query);while  (Myrset.next()){
     history = Myrset.getString( 1 );
     }
     Myrset.close();
     Mystmt.close();
if (history ==  "" )
{
     Failure =  true ;
     FailureMessage =  "链接数据库失败" ; 
}

8、浮点时间戳转换为标准时间

import  java.text.SimpleDateFormat;
import  java.util.Calendar;
import  java.util.Date;
//10位的秒级时间戳
long  time1 = ${time}; //获取时间戳变量
String result1 =  new  SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ).format( new  Date(time1 *  1000 ));
log.info( "10位时间戳(秒)--->Date:"  +result1);
 
  //13位的毫秒级时间戳
  //double time2 = 1515730332000d;
  //String result2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time2);
  //System.out.println("13位数的时间戳(毫秒)--->Date:" + result2);

9、解析jsonlist

//利用beanshell获取到json响应,而后经过JSONObject 和JSONArray 将数组解析,遍历数组的length以后,提取参数值
//导入json包
import  org.json.*;
//获取获取请求的返回值
String response_data = prev.getResponseDataAsString(); 
//日志打印获取请求的返回值
log.info(response_data);
//将String类型的返回值构形成
JSONObject对象JSONObject data_obj =  new  JSONObject(response_data);
//获取做为下一个请求post的参数值Province(两种方式)
//String Provincelist_str = data_obj.get("Province").toString(); 
JSONArray Provincelist_str = data_obj.getJSONArray( "Province" );
//log.info(Provincelist_str);
//获取Province数组的长度
int  len = Provincelist_str.length(); 

 String strlen = Integer.toString(len);
 vars.put( "MessageNum" ,strlen);
 log.info(strlen);
 int  i =  0 ;
 for (;i < len;++i)
 {
 //获取 data[ i ] 数组对象
 JSONObject jsonTemp = (JSONObject)Provincelist_str.getJSONObject(i);
 switch (i) 
 {
 case  0 :
 //两种提取参数的写法
 String NameItems = jsonTemp.getString( "Name" );
 // String NameItems = jsonTemp.get("Name").toString();
 // 两种打印参数的方法
 // vars.put("Name_1", jsonTemp.getString("Name"));
vars.put( "Name_1" , NameItems); 
log.info(NameItems);
}
}

10、递归建立多级目录

import  java.io.File; 
import  java.io.FileNotFoundException; 
import  java.io.FileWriter; 
import  java.io.IOException; 
import  java.io.RandomAccessFile; 
             StringBuffer fileBuf= new  StringBuffer(); 
             String filePar =  "D:\\\目录1\\目录2" ;
             File myPath =  new  File( filePar ); 
             if  ( !myPath.exists()){
                 myPath.mkdirs(); 
                 System.out.println( "建立文件夹路径为:" + filePar); 
             } 
            
             String filename =  "列表.csv" ;
             try  { 
                 FileWriter fw =  new  FileWriter(filePar + "\\\" + filename, true );
               
                 String originalLine = “”+ "\n" ;
                 System.out.println( "*** " + originalLine); 
                 fw.write(originalLine); 
                 fw.close(); 
             }  catch  (IOException e) { 
  
                 e.printStackTrace(); 
             }

11、jmeter经常使用的内置变量

1、log 打印日志,写入信息到jmeber.log文件
 
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即JMeterVariables,操做jmeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),经常使用方法
 
vars.get(String key):从jmeter中得到变量值
 
vars.put(String key,String value):数据存到jmeter变量中
 
15、prev 获取前面的sample返回的信息,经常使用方法
 
prev.getResponseDataAsString():获取响应信息
 
prev.getResponseCode() :获取响应

16、 调用cmd文件

String command =  "cmd /c start D:\\apache-jmeter-3.2\\负载.bat" ;
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec(command);

17、GUI小命令

button =  new  JButton(  "登陆"  );
frame =  new  JFrame(  "My Frame"  );
frame.getContentPane().add( button,  "Center"  );
frame.pack();
frame.setVisible( true );


作者:Detail-L

原文链接:https://wenliang.blog.csdn.net/article/details/108376140

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   苹果公司CEO库克日前到达浙江嘉善立讯精密工厂,并接受专访。(浙江嘉善立讯精密工厂主要生产、组装全新AppleWatch。)  库克在采访中表示,截至目前,苹果有超过95%的产品仍在中国制造组装,在过去30年的时间里推动了中国供应链的蓬勃发展。  同时,库克表示苹果希望和供应链企业在合作中实现“双赢”:不限于产品制造的合作、企业相关的应收,还应该包括环境保护、企业社会责任及教育等多方面。  9月21日,立讯精密董事长王来春接受澎湃新闻记者采访时透露,今年立讯精密为苹果生产三款iPhone15,该业务在过去一年翻了一番。她同时还透露一个重要的信息,公司正在为明年初上市的苹果头显AppleVi...
            0 0 764
            分享
          •   美国国家公路交通安全管理局(NHTSA)近日发布调查报告,称过去几年将近 1000 起交通事故和特斯拉的 Autopilot 系统存在关联,而且其中超过 20 起事故导致人员死亡。  报告指出大部分事故都是司机不专心造成的,他们可能错误地认为该公司的驾驶员辅助系统可以充当成熟的自动驾驶方案使用。  报告详细记录了 2018 年 1 月至 2023 年 8 月期间发生的 956 起事故,导致 100 多人受伤、数十人死亡,IT之家附上截图如下:  在本次关联事故中,均为特斯拉的 Autopilot 系统检测到障碍物后几秒后发生的,细心的驾驶员有足够的时间来避免事故或最大程度地减少所遭受的损失...
            0 0 551
            分享
          •   作为与欧洲监管机构建立良好关系的持续努力的一部分,TikTok表示该公司已开始斥资120亿欧元着手建设之前宣布的挪威数据中心。过去几年来,这家短视频社交公司一直在努力让全世界相信,它并不受制于其在中国的母公司字节跳动公司(ByteDance),而去年揭露的中国员工可以访问欧洲和美国用户数据的事件也让这一努力变得阻力重重。  不过,TikTok 已经做出了一系列承诺,努力消除人们对其根据欧洲《数字服务法案》(DSA)使用数据的担忧。这些承诺被捆绑在一个名为"四叶草项目"的计划中,其中包括在欧洲开设本地数据中心,并引入新的数据访问和控制流程。  该公司承诺的 120 亿欧元...
            0 0 863
            分享
          • 新浪科技讯10月20日上午消息,小米公司创始人雷军在其Twitter上发文分享了其对电动汽车行业的一些看法。雷军表示,他认为电动汽车是一种以智能化、软件化和用户体验为核心的消费电子产品。汽车行业的本质将从机械演变为消费电子,市场份额高度集中于顶级玩家手中。雷军还表示,他相信,当电动汽车行业成熟时,世界前五大品牌将占据80%以上的市场份额。他称:“换句话说,我们成功的唯一途径是成为前五名之一,并且每年出货量超过1000万辆。竞争将是残酷的。”作者:佚名文章来源:新浪科技_新浪网 (sina.com.cn)
            0 0 1262
            分享
          •   好多人都觉得测试经理已经不进行实际的测试工作了,是不是只是管管人就行了?  当然不是了,下面我们就来探讨一下测试经理到底每天都在干什么。  需求分析  作为测试经理来讲,必须对需求了解的非常透彻,那么在拿到一个需求或者项目的时候,通过需求分析报告,能准确的提出项目的可行性建议以及可能存在的风险。  避免在项目进行过程中发现了方向性的问题或者无法跨越的鸿沟。  编写测试计划  拿到测试需求后,最主要的工作不是马上就开始测试,而是需要根据提测的功能,合理的分配测试人员,编写可行性的测试计划,以保证项目或者需求能按时的完成。  用例评审  在测试人员根据需求编写完测试用例之后,测试经理应该组织相...
            0 0 1745
            分享
      • 51testing软件测试圈微信