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

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   我也是黑盒出来的呀  现在我到一家公司,就会有小朋友问我:你以前是开发吗?你是怎么变厉害的呀?到底要怎么学习呀?  我也是黑盒出来的呀,不要小看测试的能力的嘛~  很幸庆的是,我是计算机专业出来的,这个基础给我带来了很多的优势;其实很多时候,我自己也是在后悔,出来的一刹那为什么没有选择去成为一名研发,而选择了测试。  其实,越到后面越会明白,如果一开始是研发而转为测试开发,那会容易些。  为什么一开始的时候没有选择去编码呢?同样的思路:大学的时候真的不喜欢编码,觉得测试入门简单,动代码的机会比较少;可是哇!工作后,为了涨薪,硬生生的逼自己学会了编码~~汗~~  我从功能转自动化的过程  我...
            0 0 794
            分享
          • 职场新人对测试用例的困惑无非有以下几点:什么是测试用例,为什么要写测试用例?不知道怎么写,写了也不知道写的是否完整。一、什么是测试用例?百科的释义:测试用例是对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。其内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,最终形成文档。简单地认为,测试用例是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,用于核实是否满足某个特定软件需求。二、为什么要设计测试用例?1、指导测试工作的进行测试用例可以把产品需求转换为可操作的步骤【步骤、操作、输入、输出、优先级等】,从而指导测试人员按部进行测试。2、验证产品的...
            0 0 2088
            分享
          • 思考的高度决定人生的高度,最近小编从领导那里get了一项新的技能,分享给大家。其实,在我们工作中,面临着很多的事情,突发的或例行的,如果不经常思考或总结,将会面临Todo delay,工作效率比较低,长时间段内无进步。  一、什么是有高度的问题  小编先带领大家了解下"钢铁大王"卡内基的故事。通过他的故事道出什么是有高度的问题。  "钢铁大王"卡内基,16岁时,来到美国西部铁路管理局当差,负责收发电报。一天,卡内基收到一封发给局长的加急电报:"货车在阿尔图纳单轨路线上已堵塞4小时,请尽快给出处理意见。"他带着电报去汇报,这才知道局长外...
            0 0 2315
            分享
          •   为什么在JMeter中执行压力测试时,出现连接异常或连接重置错误?  答案:连接异常或连接重置错误通常是由于服务器在处理请求时出现问题引起的。这可能是由于服务器过载、网络故障或配置错误等原因导致的。  解决方法:  确定服务器的负载是否过高,如果是,可以考虑增加服务器资源或优化服务器端代码。  检查网络连接是否稳定,如果存在网络故障,可以尝试重启网络设备或切换网络环境。  确认JMeter的线程数、Ramp-up时间和循环次数是否合理设置,以避免对服务器造成过大压力。  检查JMeter的代理服务器设置,并确保在浏览器中正确配置代理,以便在测试期间正确转发请求。  JMeter运行压测脚本...
            0 0 918
            分享
          •   安全性测试(Security Testing)是指有关验证应用程序的安全等级和识别潜在安全性缺陷的过程,其主要目的是查找软件自身程序设计中存在的安全隐患,并检查应用程序对非法侵入的防范能力,安全指标不同,测试策略也不同。  但安全是相对的,安全性测试并不能最终证明应用程序是安全的,而只能验证所设立策略的有效性,这些对策是基于威胁分析阶段所做的假设而选择的。例如,测试应用软件在防止非授权的内部或外部用户的访问或故意破坏等情况时的运作。  软件安全是软件领域中一个重要的子领域,系统安全性测试包括应用程序和操作系统两个方面的安全性。而系统安全性又包括两个方面的测试:一是软件漏洞,设计上的缺陷或程...
            0 0 1066
            分享
      • 51testing软件测试圈微信