你需要的jmeter常用Beanshell脚本,还不看一眼?

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

待更新…

猜你喜欢

转载自blog.csdn.net/weixin_44275820/article/details/108376140