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

Posted 水中加点糖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速掌握jmeter——控制器与beanshell实现csv自动化测试模板相关的知识,希望对你有一定的参考价值。

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

它就是logic_controllers

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


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

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

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


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

从csv中加载请求列表

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

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

知识点

实现步骤

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

reqNamemethodurlparam
getUserInfogetuser/info/
updateUserInfopostuser/updateage=28

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

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

在[Thread Group]中添加一个[Config Element]下的[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的请求为例,其配置如下图:

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

beanshell processor大杀器

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

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

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

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

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

动态获取csv文件的行数

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

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

在其中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();

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

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

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

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

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

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

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

整体运行结果如下:

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

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

以上是关于快速掌握jmeter——控制器与beanshell实现csv自动化测试模板的主要内容,如果未能解决你的问题,请参考以下文章

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

jmeter使用详解

jmeter使用详解

jmeter-beanshell断言

JMeter博客系列:JMeter BeanShell示例

Jmeter之BeanShell脚本