11:BeanShell

一:BeanShell运行顺序

1.1前置和后置处理器Pre和Post

变量定义: 

vars:put,get方法  //put获取已定义的变量给外部使用 get获取外部变量
vars.put("name1",name);    vars.get("src_${num}")

log:日志  log.info()

prev:获取响应数据

ctx:获取请求/响应数据

props:获取jmeter变量--Debug Sampler

 

 

1.2:实例

String name="lijia";
log.info(name);
//put获取已定义的变量外部使用
vars.put("name1",name);
//put定义变量外部使用
vars.put("name2","ssss");
//获取外部---定义code变量
String code=vars.get("code");
log.info("..............");
log.info(code);
//主动抛出异常
log.error("出错了");

 

1.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);
log.info("---------今天的日期是----"+nowDate);
Calendar cal = Calendar.getInstance();
cal.setTime(sf.parse(nowDate));
//获取后推30天的时间
cal.add(Calendar.DAY_OF_YEAR,+30);
String SecondDate = sf.format(cal.getTime());
log.info("---------往后推30天的日期是----"+SecondDate);
vars.put("started",nowDate);
vars.put("ended",SecondDate);

}
catch(Exception e){
}

 

 二:beanshell爬虫

1:爬取文件/图片保存在本地(xpath提取图片地址:src和对应的图片名称alt,遍历beanshell后置处理到指定新建的文件目录)

  保存图片

  import java.io.*;
  byte[] result=prev.getResponseData();
  //D盘先新建images文件,alt为xpath循环提取的名字
  String file_name="D:\\\images\\\_${alt}.jpg";
  File file=new File(file_name);
  FileOutputStream out=new FileOutputStream(file);
  out.write(result);
  out.close();

  BeanShell PostProcessor内容如下

  

 

2:保存图片的URL地址

//保存图片网址--必须先创建D盘images文件
FileWriter fstream=new FileWriter("D:\\\images\\\name.txt",true);//true是追加,false代表覆盖--只会保留最后一条
BufferedWriter out=new BufferedWriter(fstream);
out.write("http://123.56.170.43:8088"+vars.get("src_${num}"));
out.write(System.getProperty("line.separator"));
out.close();
fstream.close();

 

三:beanshell实现unicode转中文

  1:没有beanshell转码

 

 

  2:beanshell转码后

  

 

3:beanshell postProcessor中的代码如下 

String s2=new String(prev.getResponseData(),"UTF-8");
char aChar;
int len= s2.length();
StringBuffer outBuffer=new StringBuffer(len);
 for(int x =0; x <len;){
 aChar= s2.charAt(x++);
 if(aChar=='\\'){
 aChar= s2.charAt(x++);
 if(aChar=='u'){
 int value =0;
 for(int i=0;i<4;i++){
 aChar= s2.charAt(x++);
 switch(aChar){
 case'0':
 case'1':
 case'2':
 case'3':
 case'4':
 case'5':
 case'6':
 case'7':
 case'8':
 case'9':
 value=(value <<4)+aChar-'0';
 break;
 case'a':
 case'b':
 case'c':
 case'd':
 case'e':
 case'f':
 value=(value <<4)+10+aChar-'a';
 break;
 case'A':
 case'B':
 case'C':
 case'D':
 case'E':
 case'F':
 value=(value <<4)+10+aChar-'A';
 break;
 default:
 throw new IllegalArgumentException(
 "Malformed \\uxxxx encoding.");}}
 outBuffer.append((char) value);}else{
 if(aChar=='t')
 aChar='\t';
 else if(aChar=='r')
 aChar='\r';
 else if(aChar=='n')
 aChar='\n';
 else if(aChar=='f')
 aChar='\f';
 outBuffer.append(aChar);}}else
 outBuffer.append(aChar);}
 prev.setResponseData(outBuffer.toString());
 
4:beanshell--prev,ctx
 
1:prev

//获得响应数据-字符串
String samplerData=prev.getResponseDataAsString();
log.info(samplerData);
String threadName = prev.getThreadName();
log.info(threadName);

 

 

 2:ctx---获取请求/响应数据

import org.apache.jmeter.samplers.SampleResult;
SampleResult result=ctx.getPreviousResult();
String str_Response=result.getResponseDataAsString();//获取响应数据
log.info(str_Response);
String str_request_headers=result.getRequestHeaders();//获取请求头
log.info(str_request_headers);

String str_response_code=result.getResponseCode();//获取响应代码

log.info(str_response_code);

 

 

 

3:props:获取jmeter变量--Debug Sampler          vars 中的变量仅对当前线程组内可见,props跨线程组则需要使用属性

cookie=props.get("START.HMS");
props.put("usernam","lijia");//外部调用有问题
a=props.get("usernam");
log.info(a);
log.info(cookie);

 

posted @ 2022-01-10 00:54  观呼吸  阅读(82)  评论(0)    收藏  举报