beanshell 小工具—可以在里面练习
还可以配置到classpath里然后敲命令java bsh.Interpreter 在cmd里操作
Beanshell
请求—beanshell请求
① 勾选每次调用前重置,里面定义的变量就会被重置。
② 脚本文件可以导入beanshell脚本
注意:在idea写错误有提示写完了在拷贝到beanshell里运行
脚本—运行结果在cmd里显示—print
在jmeter日志里显示—log.info(变量名);
Jmeter添加变量—beanshell添加变量后面请求用${ 变量}
启动jar包test-json-1.0-SNAPSHOT-fan — cmd执行命令切换到jar的目录,然后执行命令
java -jar test-json-1.0-SNAPSHOT-fan.jar
启动后输入网址:
下面举例写展示当前日期:开发给个接口需要传递当前时间格式为yyyy-MM-dd HH:mm:ss
Beanshell写代码
import java.util.*;
import java.text.*;
Date d = new Date();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = df.format(d);
vars.put("current_date",dateStr); //给jmeter添加一个变量,内置变量
查看结果:
添加一个请求(上面启动的jar包)—查看结果
添加变量后跨请求取值 —Date传值成功
jmeter两种变量
1、函数助手
2、变相的自定义函数
第一种:
import java.util.*;
import java.text.*;getDateStr(String format)
{ DateFormat df = new SimpleDateFormat(format); return df.format(new Date()); }dateStr = getDateStr("yyyy-MM-dd");vars.put("date",dateStr);第二种:
import java.util.*;
import java.text.*;Date d = new Date();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String dateStr = df.format(d);vars.put("current_date",dateStr); //给jmeter添加一个变量,内置变量
在Debug Sampler里查看结果
jmeter引用java文件,记事本编辑一段java代码 ,要在——查看—把隐藏已知文件扩展名得选项勾选,然后就可以改txt文件为java文件了
source("C:\\Users\\Administrator\\Desktop\\Test.java"); //引进java文件只能引用java文件不能引用jar包
beanshell代码
source("C://Users//Administrator//Desktop//Test.java");
Test test = new Test();
String str = test.hello("jiajia");vars.put("hi",str)
结果:
Jmeter-导入外部jar包
步骤为:
·在eclipse写好代码,然后把该类打成jar包(在类上点击右键->Export->jar file)·把jar包放到jmeter目录\apache-jmeter-2.13\lib\ext下·打开jmeter,添加一个http sampler,在sampler下添加一个BeanShell Sampler。·在BeanShell中的头文件中导入该jar包,例import testmail.src.hyq.utils.*Jmeter-常用内置变量
1、log:写入信息到jmeber.log文件,使用方法:log.info(“This is log info!”);
打印日志
2、ctx(JMeterContext):该变量引用了当前线程的上下文。
3、vars(JMeterVariables) :操作jmeter变量,常用方法:
a) vars.get(String key):从jmeter中获得变量值
b) vars.put(String key,String value):数据存到jmeter变量中vars.get()--从上一个http请求里正则提取器变量,用这个方法在获取到_定义个全局变量,下面引用他
props - (JMeterProperties):解决两个线程组传递参数
开发返回接口json方式—如何写断言、和提取值
http://www.bejson.com/jsoneditoronline/ 在线json格式工具 把下面内容拷贝进去
{"result":{"birthday":{"month":"12","year":"1654","day":"20"},"side":"front","address":"北京市东城区景山前街4号紫禁城敬事房","race":"汉","gender":"男","legality":{"Temporary ID Photo":0,"Screen":0,"Edited":0.991,"Photocopy":0,"ID Photo":0.009},"head_rect":{"rb":{"x":0.93333334,"y":0.7379679},"rt":{"x":0.93333334,"y":0.16042781},"lb":{"x":0.62,"y":0.7379679},"lt":{"x":0.62,"y":0.15508021}},"name":"韦小宝","id_card_number":"11204116541220243*","request_id":"1504184189,7d75096e-f9bb-49ee-83e2-f4070ca7e14c","time_used":425},"bizNo":"123456","serviceCode":"000082"}
提取json $.result.name[0]第一个值json $.result.name[1]第二个值 在上面获取值。
练习:
查看结果树里的形式—在这里也可以测试提取
添加JSON Extractor—json提取值方式写JsonPath
取值后传递给下一个线程组
1、先改一下属性,改成True
2、写脚本赋值
3、查看结果
添加一个Beanshell前置处理器用props获取值
可能存在的问题:多线程时取当前系统日期,日期不一致。测试计划设置独立运行每个线程组、时间就一一致了。
5、prev - (SampleResult):获取前面的sample返回的信息,常用方法:
a) getResponseDataAsString():获取响应信息
b) getResponseCode() :获取响应code c) setDataEncoding(String dataEncoding) :设置响应结果的编码prev.setDataEncoding("utf-8") ;
http请求后面添加Beanshell后置处理器—解决乱码问题
BeanShell PreProcessor—一般是用户请求要用到这个参数,用前置处理器,处理好了传递参数,提前处理请求参数,如:图片处理,加密解密
举例子1、http://www.vgot.net/test/image2base64.php?
2、图片和jar包:axis-1.4.jar放到jmeter安装目录里lib下ext文夹里,导入jar包后一定要重新启动。
beanshell前置处理器
import util.*;
import org.apache.axis.encoding.Base64;import org.apache.commons.io.IOUtils;InputStream input = new FileInputStream("E:\\image-0082.jpg");
ByteArrayOutputStream output = new ByteArrayOutputStream();IOUtils.copy(input, output);byte[] array = output.toByteArray();String post_image = Base64.encode(array);vars.put("image",post_image);
查看运行结果—把运行结果进行解析出来的就是image-0082.jpg图片本次主要就是验证图片
把get请求里面的内容复制了,放到解析网站进行解码。
BeanShell PostProcessor —对http的结果进行处理
举例子:
网址 http://localhost:8090/test_gzip,
网站乱码—解决乱码问题
后置处理器—把解压缩的文件进行处理—解压缩zip的代码
import java.io.*;
import java.util.zip.*;//获取上一个结果
byte[] bytes = prev.getResponseData();ByteArrayOutputStream out = new ByteArrayOutputStream();ByteArrayInputStream in = new ByteArrayInputStream(bytes);try { GZIPInputStream ungzip = new GZIPInputStream(in); byte[] buffer = new byte[256]; int n; while ((n = ungzip.read(buffer)) >= 0) { out.write(buffer, 0, n); } gzip_str = out.toString("utf-8"); log.info("result-ungzip:"+gzip_str); } catch (Exception e) { e.printStackTrace(); log.info(e.getMessage());}运行后的结果—日志里出现result就可以了
加检查点、加断言
添加断言—根据变量查找结果
动态验证点—beanshell断言
BeanShell断言_写好请求后运行—在查看结果树里选择JSON Path Tester里面查找$.result.time_used的值
在JSON Extractor 里面提取值
添加个debug sampler 验证是否正确
beanshell断言 如果接口返回<500的算成功
添加beanshell断言
运行查看结果
如果开发说想知道错误率是多少如何操作
添加一个聚合报告—查看错误率