在jmeter中,有一个组件总散发着它耀眼的光芒,以至于每次遇到某个测试计划的案例设计时,都总能让我想到它
当然,它不只是一个组件,而是一系列逻辑控制器的集合
在我看来,如果代码有了设计模式可以变得美而优雅
那么jmeter有了logic controller之后,jmeter就不单单仅是一款性能测试工具
通过将各种逻辑控制器的组合,jmeter也可以变得极具魅力而又不失灵魂
下面以一个小实例,一起进入jmeter逻辑控制器的世界
当遇到需要测试的接口比较多时,想要通过外部文件进行导入,则可以通过csv进行读取。
这里以一个简单的测试csv模板为例,演示一下如何使用jmeter中的csv config、if controller、loop controller组件实现一个较为通用的请求模板。
假设想导入的接口csv文件内容如下:
reqName | method | url | param |
---|---|---|---|
getUserInfo | get | user/info/ | |
updateUserInfo | post | user/update | age=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的话,就不算真正用过jemeter。个人感觉那句话还是有点道理
就以上面从csv中读取接口的例子为例,来简单谈一下感受:
上面的自动化从csv中读取请求数据总感觉还是有点鸡肋,主要是每次运行时如果csv中数据条数发生了改变,则需要手动修改循环控制器中的循环次数,有点半自动化测试的感觉。
如果能做到程序自动根据csv中行数自动填入循环次数的话,那么就能真正做到自动化了。为了解决这一问题,则可以使用beanshell处理器来解决这个问题了。
关于beanshell的详细资料可去它的官网查看:http://www.beanshell.org
这里以上面读取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:上面代码中之所以能直接使用vars,log这些变量,是因为它们是jmeter的beanshell中的内置变量
关于更多jmeter中beanshell的应用可以查看官方提供的实例:https://jmeter.apache.org/usermanual/component_reference.html#BeanShell_Sampler
当有了beanshell在jmeter中关于变量的定义后,在其他地方就可以直接使用上面beanshell所定义的变量了
如这里的,在循环控制器的循环次数中使用这个变量,填入:${testCaseCount},之后再运行这个测试用例。
为了观察方便,在beanshell中也加入了日志,同时也可添加一个Debug Sampler查看运行时的变量信息。
整体运行结果如下:
通过查看处理结果树和日志信息,我们可以看到确实也实现了csv行数的自动提取。
当然,正如《快速掌握jmeter(一)——实现自动登录与动态变量》文章中所说的那样,实际测试时不建议直接在gui中直接运行测试用例,正式测试时建议使用命令行的方式进行测试用例的运行额~