• Jmeter-记一次自动化造数引发的BeanShell写入excel实例


    一、前言

      最近工作和生活说忙也忙,说不忙也不忙,但就是已经感觉很长时间没有get新的技术技能了,就是一丢丢的那种也没有,哈哈哈,今天就来讲一下最近get到的小技能吧。

      工作中,由于某个需求需要几百条数据去验证某个接口,肯定不能手动加啦,基于测试周期紧张,直接考虑用jmeter的循环控制器辅助实现。

    二、接口背景介绍

      业务说明:点击创建按钮,弹出创建界面,输入必填项后,点击确定,返回创建数据成功。

    1、创建接口

      就是需要用该接口创建数据,对于接口的说明如下:

      1)接口请求方法:PUT

      2)必传的入参需要变量的字段有:userCode,userId,userName,remarkid 

      3)其余字段根据实际业务,可以传固定值

    思路tip:首先要确认变量字段,其次确认变量字段来源,最后确认如何能获取到变量。当前的实例中,除了remarkid,其余3个变量字段是从另外一个查询接口读取的,详细见第2点。

    2、查询用户接口

      在创建界面,输入用户名称时会调用【查询用户】接口,该接口返回的数据就是【创建】接口中所需要的入参字段,返回的json格式如下:

     

    三、Loop Controller介绍

      很早之前就已经在工作上用到过这个组件,今天突然发现我居然没有针对这个组件写详细的博客,太尴尬了,那现在就简单了解下这个组件的用法吧。

       Loop Count:循环次数,分为永远、自定义次数——勾选Forever后,自定义次数置灰不允许输入,未勾选,则可以

      按字面意思,其实它就是循环该控制器下的请求,一般跟计数器配合使用,具体根据实际场景来。

      如果非常熟悉Jmeter工具的,想必也知道线程组也可以设置循环次数,这两者其实可以理解为父子关系,比如循环控制器设置循环2次,线程组设置循环4次,则执行的结果如下:  线程一共循环运行了4轮,每轮会循环请求接口2次

    四、方法1— Loop Controller循环调用接口

     1、脚本结构如下

    2、使用强大的JSON提取器,提取返回的字段

    3、用户查询接口返回结果如下

      在察看结果树的Debug中可以看到提取的userCode,userId,userName,其中userCode_matchNr表示匹配到的总数

     4、创建接口入参使用变量值

      查询接口是提取了返回字段的所有值,要引用变量的写法就相当于 ${userCode_1},那总不能在入参里写死_1吧,因为要循环创建的,得想办法让userCode_x,后面的_x是可以每次自增的,所以要结合counter计数器函数。

      而__V就是要把它们嵌套起来,__V属于嵌套函数,有兴趣可以网上百度,如果不懂的话直接复制那串改一下变量就行。

      remarkid在业务上是不允许重复的,所以这里使用Random函数,即随机数函数,让它随机生成一串数字即可。

    "userCode":"${__V(userCode_${__counter(\,)},)}","userName":"${__V(username_${__counter(\,)},)}","userId":"${__V(userId_${__counter(\,)},)}","remarkid":"${__Random(1000,9000,)}"

    5、循环控制器循环次数使用变量值

      循环控制器中的自定义次数考虑到灵活性,使用查询接口匹配到的总数(变量_matchNr),一共提取3个字段,所以用其中任意字段都行,引用格式: ${username_matchNr}

    6、执行

      完成以上步骤,就可以执行创建数据啦,执行结果我就不贴了。

     

    五、方法2—Loop Controller循环调用JDBC

      跟方法1的步骤是一样的,只是方法2是通过调用jdbc request,即sql循环插入数据,这里就不贴图啦,具体看脚本结构,然后在jdbc里写条insert语句,将相应字段替换成引用变量即可。

      注:执行insert,Query Type需要选择【Prepared Update Statement】

     

    六、方法3—BeanShell写入excel,手动生成sql语句

    1、BeanShell PostProcessor

      这种其实也是通过sql插入,只不过是手动插入,在用户查询请求下添加BeanShell PostProcessor,脚本如下:

    复制代码
    //指定需要写入到哪个文件
    FileWriter fs=new FileWriter("C:/Users/13710/Desktop/9000.csv",true);
    //创建一个字符缓存输出流
    BufferedWriter out = new BufferedWriter(fs);
    
    //另一种获取变量值的写法
    //int b = Integer.valueOf("${username_matchNr}");
    //System.out.println("接口返回的总数为:"+b);
    
    for(int i=1;i<= ${username_matchNr};i++){
        username= vars.get("username_"+i);
        userId = vars.get("userId_"+i);
        userCode = vars.get("userCode_"+i);
        out.write(username+","+userCode+","+userId);
        out.write(System.getProperty("line.separator"));
        System.out.println("输出的值是:"+username);
        }
    
    out.close();
    fs.close();
    复制代码

    2、执行后自动生成.csv文件

      可以看到excel里有3列,因为beanshell脚本拿到3个变量字段写到了excel里了

     3、运用强大的excel功能生成sql语句

      D4列是自己先写一条sql哈,写好后往下拖动就会自动生成其他的,其中需要变的均引用表格变量,格式:"&A1&"

    温馨tip:如果公式中的字符串过长,要用CONCATENATE函数

    例子1(这个没超的):   =CONCATENATE("INSERT INTO contact(name, post,id)VALUES ("&A1&", '"&B1&","&C1&"');")

    例子2(分成了4个字符串,因为公式中每一个字符串都不能超过255字符):

     4、将D4列直接复制到数据库里执行即可

     

  • 相关阅读:
    git常用命令
    计算机硬件的读写速度差异
    ctfshow web七夕杯
    构建本地Web小游戏网站:Ubuntu下的快速部署与公网用户远程访问
    翻译像机翻?4点教会你ChatGPT高质量翻译
    知名设计师推荐:2023年Pantone年度年度色彩用法
    上手Python之str(字符串)
    MATLAB算法实战应用案例精讲-【推荐系统】CTR预估模型(补充篇)
    OceanBase 4.0 三节点生产环境部署两三事
    大话HTTP协议,基础的扎实才决定了你的高度
  • 原文地址:https://www.cnblogs.com/Chilam007/p/16505774.html