目录
JMeter(二十一):使用BeanShell解析Json格式的报文https://tester-joe.blog.csdn.net/article/details/103954794
JMeter(二十二):使用Beanshell Assertion做高级断言https://tester-joe.blog.csdn.net/article/details/88867111
JMeter(二十三):使用beanshell断言处理json数据https://tester-joe.blog.csdn.net/article/details/88530637
JMeter(二十四):实现文件上传的http接口测试https://tester-joe.blog.csdn.net/article/details/103954671
JMeter(二十五):正则后置处理器及逻辑循环控制器https://tester-joe.blog.csdn.net/article/details/78429783
JMeter(二十六):Scanner类实现短信验证码处理方式https://tester-joe.blog.csdn.net/article/details/78288761
JMeter(二十七):tesseract工具实现图片验证码处理方式https://tester-joe.blog.csdn.net/article/details/78293250
JMeter(二十八):接口自动化测试设计之数据驱动https://tester-joe.blog.csdn.net/article/details/88793238
JMeter(二十九):接口自动化测试设计之参数动态替换https://tester-joe.blog.csdn.net/article/details/105642631
前言:
对于大多数测试人员来说,JMeter应该是目前使用最频繁的测试工具之一(因人而异,萝卜白菜各有所爱),因为其开源、免费、轻量、功能强大,支持很多种协议,除了测功能,还能做接口和性能自动化测试;深受业内喜爱!
从各大招聘网站或其他线上培训机构部分数据显示,常常使用其来吸引潜在学员(介绍如何使用),而在性能测试工具中,JMeter的市场占有率已经慢慢的超过了带头大哥loadrunner性能测试工具;面对如此优秀的测试工具,作为优秀的你怎能不拥抱它呢?
然而经常看到各种QQ群或其他博客论坛讨论JMeter的各种“晦涩难懂”的功能<需求>,譬如支持一些groovy脚本、还要黏贴python胶水语言、居然还有使用js的及selenium自动化?当然这不排除其场景确实需要这些来辅助,友情提示一下:切莫过往矫正!!!
在实际工作中,JMeter能用到的功能并不多,掌握主要的功能元件,基本上可以搞定80-90%的需求,所以,不要把时间耗费在工具不常用的功能上,如果是使用其做性能测试<只需设计好脚本场景就好>,分析定位性能问题、性能调优才是重中之重。
JMeter常用功能介绍
从JMeter2.x版本用到现在的5.x,常用功能进阶得并不是很多,如下举例(想要详细了解的可以参考其JMeter官网或本人CSDN博客都有部分使用介绍)。
从添加测试计划-线程组开始(基本按执行顺序介绍):
【配置元件】
HTTP信息头管理器:接口中特别需要指定的请求头,如content-type、或token鉴权;
HTTP Cookie管理器:适用于做web功能测试,保持cookie不过期;
CSV 数据文件设置:相当于参数化数据文件,可以是测试用例(接口自动化中);
HTTP请求默认值 :对于接口请求中通用的公共部分进行提取,如url、port或通用参数。
【前置处理器】
BeanShell PreProcessor:用于提前准备测试数据的元件,支持java及jmeter自带的功能脚本;
User Parameters:用于提前准备测试数据的元件,不适合于大量的测试数据驱动;
JDBC PreProcessor:用于提前准备测试数据的元件,比较灵活,可以从数据库中捞取测试数据。
【逻辑控制器】
Transaction Controller:这个来做事务控制的,譬如一个场景中涉及多个接口,单个接口是一个子事务,但是我们需要将其作为一个整体事务看待,就需要这个元件了;
ForEach Controller:一遍用来遍历上一个接口返回的数据中有多个元素的时候,例如提取响应结果中所有满足条件的参数,需要一一遍历,又譬如sql请求的结果集也有需要遍历的场景;
only once Controller:适用于性能测试场景中只需一次操作的请求,例如登录,这里必须要提一点的是它只跟线程组中的线程数有关,至于迭代数无关。
If Controller:条件控制器,支持__jexl3函数表达式及__groovy脚本或其他变量,
【定时器】
固定定时器:相当于thinktime;
高斯随机定时器:这个类似thinktime但是它是有活动范围的,即一个时间区间等待;
Synchronizing Timer:同步定时器,jmeter中的集合点,它的第二个参数是timeout,如果非0,即为等待对应时间不满足集合数也会执行sampler请求。
【Sampler】
HTTP请求:应该了解http协议的各种请求及传参方式,比较难的应该是文件上传/下载的接口,同样支持soap协议的请求;
BeanShell Sampler:一般作用自己写脚本来完成测试,毕竟需要一些java基础;
Debug Sampler:说白了就是调试脚本时使用,需要测试jmeter脚本中使用的变量是否正确;
比如sampler取样器支持的java、jdbc、ftp、webservice等协议,如果不满足其它协议,需要我们自己开发,所以java基础是必备的条件。
【后置处理器】
正则表达式提取器:动态参数关联的方式很多,可以根据实际请求来选择,例如json的少不了json path提取器,又如爬虫工作中喜欢用的正则;
Debug PostProcessor:除了可以看到jmeter变量,还可以看到配置信息,最好放在正则表达式提取器后面,否则看不到提取的结果,说白了还是对后置处理器使用的调试;
BeanShell PostProcessor:处理samlper请求响应结果数据的。
【断言】
响应断言:最简单的,在接口测试设计中,一般没有出现数据变动或者响应结果简单的情况下使用;
BeanShell断言:属于高级断言,因为是编写脚本,所以比较灵活。
【监听器】
查看结果树:调试结果使用,其上有各种tester调试视图;
聚合报告:可以查看性能测试结果的数据,如:响应时间分:90、95、99,这几个值可以通过配置文件修改的,还有错误率、tps等性能指标。
【函数助手】
这个按需使用,例如随机函数、随机字符串函数、线程计数器函数、环境变量参数函数、时间函数等。
先提前说一句:分布式压测:什么样子的情况下需要分布式压测?
第一,大用户量并发的时候
第二,负载机不支持大并发的时候
第三,同第一,大数据的情况下
另外,beanshell相关的元件,基本语法是通用的,上述所介绍元件中就有四类beanshell元件使用:前置处理器、取样器、后置处理器、断言等等,可见java基础非常重要!
【JMeter执行顺序】
配置元件 → 前置处理器 → 定时器 → 取样器 → 后置处理器 → 断言 → 监听器;
tips:同一层级的元件,按顺序执行;
最后,我们来看看官方的性能测试最佳实践,地址是:Apache JMeter - User's Manual: Best Practices
chrome浏览器右键翻译内容如下:
16.7减少资源需求
关于减少资源使用的一些建议。
- 使用CLI模式:jmeter -n -t test.jmx -l test.jtl
- 使用尽可能少的侦听器;如果使用上述的-l标志,则可以将其全部删除或禁用。
- 在负载测试期间不要使用“查看结果树”或“在表中查看结果”侦听器,仅在脚本编写阶段使用它们来调试脚本。
- 与其使用大量相似的采样器,不如在循环中使用相同的采样器,并使用变量(CSV数据集)来改变采样。[“包含控制器”在这里无济于事,因为它将文件中的所有测试元素添加到测试计划中。
- 不要使用功能模式
- 使用CSV输出而不是XML
- 只保存您需要的数据
- 使用尽可能少的断言
- 使用性能最高的脚本语言(请参阅“ JSR223”部分)
如果您的测试需要大量数据(尤其是需要将其随机化),请在可通过CSV数据集读取的文件中创建测试数据。这样可以避免在运行时浪费资源。