前言:这篇文章主要向大家介绍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