• 快速掌握jmeter(二)——控制器与beanshell实现csv自动化测试模板


    在jmeter中,有一个组件总散发着它耀眼的光芒,以至于每次遇到某个测试计划的案例设计时,都总能让我想到它

    它就是logic_controllers

    当然,它不只是一个组件,而是一系列逻辑控制器的集合

    logic controllers


    在我看来,如果代码有了设计模式可以变得美而优雅

    那么jmeter有了logic controller之后,jmeter就不单单仅是一款性能测试工具

    通过将各种逻辑控制器的组合,jmeter也可以变得极具魅力而又不失灵魂


    下面以一个小实例,一起进入jmeter逻辑控制器的世界

    从csv中加载请求列表

    当遇到需要测试的接口比较多时,想要通过外部文件进行导入,则可以通过csv进行读取。

    这里以一个简单的测试csv模板为例,演示一下如何使用jmeter中的csv configif controllerloop controller组件实现一个较为通用的请求模板。

    知识点

    实现步骤

    假设想导入的接口csv文件内容如下:

    reqNamemethodurlparam
    getUserInfogetuser/info/
    updateUserInfopostuser/updateage=28

    也就是这样的一个csv文件:
    csv

    在jmeter中可以通过控制器中的循环控制器csv data set config来进行加载。

    在[Thread Group]中添加一个[Config Element]下的[csv data set config],如下图。

    csv data set config

    之后在其中填入要读取的csv文件路径,并配好每一列要读取的变量名称。

    之后再添加一个循环控制器(Loop Controller),并将上面添加好的csv data set config放到这个Loop Controller下,以此达到循环csv每行的数据。

    之后再添加两个if controller,分别处理GET请求与POST请求。
    在对应的if controller中填写js表达式,如GET请求中填入:

    “${method}”==“get”

    POST请求中填入:

    “${method}”==“post”

    之后再在各自的if controller下添加对应的请求http request即可。
    其中对于http request的配置信息,都通过变量应用的方式来进行填入。以http post的请求为例,其配置如下图:

    post req

    之后再修改循环控制器中的循环次数,如这里excel中有两条数据,则将循环次数填写为2,再点击运行则可看到运行结果

    preview

    beanshell processor大杀器

    beanshell

    曾有人说:如果不知道beanshell processor的话,就不算真正用过jemeter。个人感觉那句话还是有点道理

    就以上面从csv中读取接口的例子为例,来简单谈一下感受:

    上面的自动化从csv中读取请求数据总感觉还是有点鸡肋,主要是每次运行时如果csv中数据条数发生了改变,则需要手动修改循环控制器中的循环次数,有点半自动化测试的感觉。

    如果能做到程序自动根据csv中行数自动填入循环次数的话,那么就能真正做到自动化了。为了解决这一问题,则可以使用beanshell处理器来解决这个问题了。

    关于beanshell的详细资料可去它的官网查看:http://www.beanshell.org

    动态获取csv文件的行数

    这里以上面读取csv文件的案例为例,来将上面的例子完善一下。

    在jmeter中添加一个BeanShell PreProcessor,用以获取出csv中的具体用例行数

    beanshell preProcessor

    在其中script处填入想要处理的BeanShell代码:

    String testCaseCsvPath = "D:/temp/reqTest.csv";
    System.out.println("----->testCaseCsvPath="+testCaseCsvPath);
    BufferedReader br = new BufferedReader(new FileReader(testCaseCsvPath));
    String line;
    Integer lineCount = 0;
    while ((line = br.readLine()) != null) {
     lineCount++;
    }
    vars.put("testCaseCount",(lineCount-1)+"");
    log.info("------>>>testCaseCount:{}",(lineCount-1));
    br.close();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    上面的代码中,testCaseCount即为所提取出的用例数

    在写beanshell代码的时候为了便于编码,可以在开发工具中先开发好后再复制进去

    TIPS:上面代码中之所以能直接使用varslog这些变量,是因为它们是jmeter的beanshell中的内置变量
    inner param

    关于更多jmeter中beanshell的应用可以查看官方提供的实例:https://jmeter.apache.org/usermanual/component_reference.html#BeanShell_Sampler

    当有了beanshell在jmeter中关于变量的定义后,在其他地方就可以直接使用上面beanshell所定义的变量了

    如这里的,在循环控制器的循环次数中使用这个变量,填入:${testCaseCount},之后再运行这个测试用例。
    use param

    为了观察方便,在beanshell中也加入了日志,同时也可添加一个Debug Sampler查看运行时的变量信息。

    整体运行结果如下:
    run
    通过查看处理结果树和日志信息,我们可以看到确实也实现了csv行数的自动提取。

    当然,正如《快速掌握jmeter(一)——实现自动登录与动态变量》文章中所说的那样,实际测试时不建议直接在gui中直接运行测试用例,正式测试时建议使用命令行的方式进行测试用例的运行额~

  • 相关阅读:
    Catalan 数 和 Stirling 数
    MyBatis总结
    【畅购商城】详情页模块之评论
    美国FBA海运详解:美国FBA海运费用价格有哪些
    2023亚太杯数学建模思路 - 案例:感知机原理剖析及实现
    kafka介绍
    嵌入式linux sqlite3读写demo
    Linux进程间通信(IPC)的几种方式
    用JpaTransactionManager操作数据库事务
    项目经验分享:基于昇思MindSpore实现手写汉字识别
  • 原文地址:https://blog.csdn.net/puhaiyang/article/details/126237284