记录性能测试脚本开发的过程

---恢复内容开始---

场景:一个社交电商的支付场景

考虑的链路:大量的用户+选择不同商品+不同用户进行下单+选择自己平台支付(余额)+查看不同订单列表+进行售后

需要的技术支持:验证码需要废掉,用户支付密码写死

设计如下:

  1. 分三个步骤,设计三个线程组;第一个步骤制造大量的登录用户,并产生token;第二个这么多用户选择商品,进行下单;第三个进行支付,并后期的退款;
  2. 由于我有三个线程组,所有我在testplan,勾选独立运行每个线程组,我不希望同时进行,导致可能的失败;

     

  3. 造数据,造大量的登录注册用户,获得数万计的token,电话号码的制造,我不管你们有多少方法,我就简单实现,jmeter自带的函数助手,random函数${__Random(13111111111,15999999999,)},
  4. 提取token,常用的方法是正则匹配,json提取器,那个用的liu,你就用哪个吧,这个就不用贴图比较简单;
  5. 在制造大量的数据的时候,我接到了一个任务需求,就是这些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();
    }

     

  6. 当时想到有多个线程组,如果跨线程合作,就想到全局变量,这里也记录下;设置全局变量暂时记录2种方法,一种beanshell取样器,一种beanshell后置处理器,都会使用函数__setproperty函数

    然后拷贝出来,把它放在beanshell取样器脚本里面,然后使用__P函数,引用全局变量,

    现在就可以在任何线程里面引用token了(全局我暂时只能传递一个,鸡肋了,后期再研究下),另外一种是beanshell后置处理器,脚本如下:

    String userId=bsh.args[0];
    print (token);
    ${__setProperty(token,${token},true)}

     

  7. 在压测过程中,发现每次启动脚本,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("删除成功 "); 
        }

    每次启动前,就可以把我之前文件夹下的文件全部删除了。

  8. 之前产生了csv,自然我要读数据,有很多方法,有csvdata读取-路径是绝对路径,我习惯用stringFromFile函数"${__StringFromFile(E:\test\order.csv,order,,)}";
  9. 我在获取订单列表的时候,总会有翻页,而且页码有规律的增加,这个时候就用到counter这个配置元件或者函数都可以,我喜欢函数${__counter(True;1,)}
  10. 基本线程都完成了,这个时候你就需要定时器,我选择两种,固定/聚集定时器,至于原理这里就不在赘述简单,还有目前是脚本的开发,至于调试,和业务也需要挂钩,漏斗模型或者线程的比例后期再研究
  11. 最后贴一张我的成果

     

posted @ 2019-07-06 23:21  风清扬不在华山  阅读(842)  评论(2编辑  收藏  举报
2