记录性能测试脚本开发的过程
---恢复内容开始---
场景:一个社交电商的支付场景
考虑的链路:大量的用户+选择不同商品+不同用户进行下单+选择自己平台支付(余额)+查看不同订单列表+进行售后
需要的技术支持:验证码需要废掉,用户支付密码写死
设计如下:
- 分三个步骤,设计三个线程组;第一个步骤制造大量的登录用户,并产生token;第二个这么多用户选择商品,进行下单;第三个进行支付,并后期的退款;
- 由于我有三个线程组,所有我在testplan,勾选独立运行每个线程组,我不希望同时进行,导致可能的失败;
- 造数据,造大量的登录注册用户,获得数万计的token,电话号码的制造,我不管你们有多少方法,我就简单实现,jmeter自带的函数助手,random函数${__Random(13111111111,15999999999,)},
- 提取token,常用的方法是正则匹配,json提取器,那个用的liu,你就用哪个吧,这个就不用贴图比较简单;
- 在制造大量的数据的时候,我接到了一个任务需求,就是这些token我需要存在csv文件中,存在本地文件中。。。,拿到需求我有点懵逼,如果我用python写,很容易写到本地呀,仔细想了下,beanshell应该可以,他就是Java,应该可以提供方法,果然可以,添加一个beanshell后置处理器,脚本如下:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
String token=bsh.args[0];
try {
FileWriter fstream=new FileWriter("E:\\test\\token.csv",true);
BufferedWriter out=new BufferedWriter(fstream);
out.write(vars.get("token")+"\n");
out.close();
fstream.close();
} catch (IOException e) {
e.printStackTrace();
}
- 当时想到有多个线程组,如果跨线程合作,就想到全局变量,这里也记录下;设置全局变量暂时记录2种方法,一种beanshell取样器,一种beanshell后置处理器,都会使用函数__setproperty函数
然后拷贝出来,把它放在beanshell取样器脚本里面,然后使用__P函数,引用全局变量,
现在就可以在任何线程里面引用token了(全局我暂时只能传递一个,鸡肋了,后期再研究下),另外一种是beanshell后置处理器,脚本如下:
String userId=bsh.args[0];
print (token);
${__setProperty(token,${token},true)} - 在压测过程中,发现每次启动脚本,token等值就会追加在csv文件后面,我希望每次数据都是干净,发放如下,在保存数据之前,添加一个beanshell取样器,脚本如下,
String path = "E:\\test";
File file = new File(path);
if (!file.exists()) {
System.out.println("目录不存在" + "the dir is not exists !");
return false;
}
String[] content = file.list();//取得当前目录下所有文件和文件夹
for (String name : content) {
File temp = new File(path, name);if (temp.isDirectory()) {
//判断是否是目录
temp.delete();
//删除空目录
} else {
if (!temp.delete()) {
//直接删除文件
System.err.println("Failed to delete " + name);
}}
return true;log.info("删除成功 ");
}每次启动前,就可以把我之前文件夹下的文件全部删除了。
- 之前产生了csv,自然我要读数据,有很多方法,有csvdata读取-路径是绝对路径,我习惯用stringFromFile函数"${__StringFromFile(E:\test\order.csv,order,,)}";
- 我在获取订单列表的时候,总会有翻页,而且页码有规律的增加,这个时候就用到counter这个配置元件或者函数都可以,我喜欢函数${__counter(True;1,)}
- 基本线程都完成了,这个时候你就需要定时器,我选择两种,固定/聚集定时器,至于原理这里就不在赘述简单,还有目前是脚本的开发,至于调试,和业务也需要挂钩,漏斗模型或者线程的比例后期再研究
- 最后贴一张我的成果