安装JMeter
下载解压后直接运行即可:https://jmeter.apache.org/download_jmeter.cgi
打开后如下:
安装插件
参考:Performance Testing Web Sockets with JMeter
本身jmeter并不支持web socket,但是好在有插件。
首先下载jmeter-plugins,具体见:https://jmeter-plugins.org/install/Install/。然后会多出一个选项:
打开后搜索websocket安装即可:
Jmeter基础
1)组件概览
打开jmeter后,默认有个Test Plan项目,我们只需要右击,添加需要的组件来组合实现我们的测试脚本即可。
如下图,有9大类(Options/Choose Language/Chinese 可切换语言):
2)Threads(Users)
概述
可以指定开多少个线程,在这个节点下的逻辑,都会在不同的线程中并发执行。这也是jmeter最基础的组件。
有2个特殊的线程组:
setUp
:在其他线程组执行之前执行。一般用来初始化一些信息,比如请求token。- tearDown:停止的时候做一些事情,不常用。
如下,有1个setup,2个并发测试http接口的线程组,其中 查火车 会被并发执行10次(启动10个线程同时请求)。
执行顺序
创建好线程组之后,我们就可以 “写脚本语句” 了,“脚本语句” 执行的顺序也是从上往下执行的,比如,下图的效果就是,启动jmeter之后,会暂停3秒钟
注意:
我们必须创建一个线程组,才能执行http接口请求
。
Sampler(采样器)
在线程组上点击,会多出2个子组件:
- Sampler:采样器,最重要的组件。比如发送HTTP请求,打开WebSocket连接等等。
- Logic Controller:这个选项只会在 线程组上点击时才会出现,包含 IF判断、for/while循环、switch等一些逻辑组件,可以实现编程的效果!
支持的Sampler :
示例Sampler——HTTP Request界面:
到这里,通过
Threads(Users)
和
Sampler
的组合,我们就可以
测试HTTP接口
的并发了。
3)Config Element
配置组件,主要是为Sampler服务的。比如有个HTTP接口,需要携带认证的token头,这个时候,我们可以增加一个 HTTP Header Manager来实现接口认证。
下图是一个示例:
我们拖入一个
View Results tree
,就可以看到效果了(自动为这个请求注入了Token值,并且是动态的):
4)Listener(监听器)
最有用的是这2个组件
View Result Tree
:HTTP结果调试,有点类似浏览器的F12。Summary Report
:性能测试报告,比如请求次数、成功次数、接口耗时、流量等等
View Result Tree见上一节中的截图,Summary Report界面如下:
5)Timer(定时器)
我们可以结合 Logic Controller 来实现 接口间隔 N 秒请求的功能,来测试稳定性,有固定间隔的、也有随机间隔的。这个比较简单,不再过多介绍。
6)Pre Processors 和 Post Processors
前置处理器不常用,主要是
后置处理器
,经常搭配
Debug Sampler
来使用,比如
JSON Extractor
会经常用来解析登录后的token,并把这个token传递给其他接口调用。
JSON Extractor用法
假设 登录 接口返回下面的数据:
{"guestToken":"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJjbGllbnRfaWQiOiI5NmJjMzNmZC00YzdmLTRmMGUtYTQxZS0xMWZjNGU3NmMyM2YiLCJleHBpcmVzX2F0IjoxNjg3NTAwNjE4LCJ0eXBlIjoiYWNjZXNzIn0.RZxufN0kAw5XnDpVDvkxycJOxMo9WNuohl5kTsrtH-JgwnkZnz0ozNGtJaSPnwAxdG95RQSpZmk92eisNcvSOg"}
我们只需要这样配置即可把结果拿出来:
然后,在这个Sampler后面拖入一个Debug Sampler,我们看到值被保存:
最后, 在后面的Sampler里,就可以引用了:
1)
同一个 Thread Group
,可以直接用${ 变量名 } 引用
2)跨 Thread Group,需要使用Shell脚本,设置全局变量
代码:
${__setProperty(token,${token},)};
其他线程组引用:
${__property(token,,)}
示例:
四、示例
1.模拟流程
以下面这个流程为例,演示测试WebSocket并发:
- 通过/auth/login登录,拿到token
- 模拟多人同时在线场景(100人) - 打开webSocket连接,头部需要携带login拿到的token做认证- 定时发送ping心跳,循环执行N次- 最后,关闭webSocket连接
- 输出性能测试报告
2.详细步骤
登录认证
1)
创建setUp Thread Group
。选中Test Plan,鼠标右击->setUp Thread Group->Add->Threads->setup Thread Group,使用默认线程数1即可。
2)
拖入HTTP请求
。在 setUp Thread Group 上右键点击->Add->Sampler->HTTP Request。
3)
配置接口参数
,设置请求格式。如果是x-www-form-urlencoded格式,还需要额外增加一个HTTP Header Manager,具体参考:如何配置 x-www-form-urlencoded?
4)创建Json后置处理器,用来提取登录成功后返回的token,便于其他接口使用。
token是存储的变量,accessToken是解析的路径,比如下面这样:
{"accessToken":"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJjbGllbnRfaWQiOiI5NmJjMzNmZC00YzdmLTRmMGUtYTQxZS0xMWZjNGU3NmMyM2YiLCJleHBpcmVzX2F0IjoxNjg3NTAwNjE4LCJ0eXBlIjoiYWNjZXNzIn0.RZxufN0kAw5XnDpVDvkxycJOxMo9WNuohl5kTsrtH-JgwnkZnz0ozNGtJaSPnwAxdG95RQSpZmk92eisNcvSOg"}
5)拖入一个Debug Sampler,来调试Json提取是否提取正确。
6)拖入一个BeanShell Sampler,来把token设置成全局变量,供其他线程组使用。
${__setProperty(token,${token},)};
最后,看起来该是这样的:
WebSocket线程组
1)
创建一个Thread Group
,设置线程数量(Number of Threads(users) )为
10个
2)为例节省篇幅,请按照下图,分别拖入对应的组件:
3)对应上图1和2,拖入View Results Tree 和 Summary Report。
4)点击执行
5)鼠标点击View Results Tree,我们就能看到执行结果了(红色代表错误,绿色代表成功) 。
6)最后,点击Summary Report,看下各个请求的执行情况即可
7)最后,别忘记把整个脚本保存,jmeter通过命令行的方式执行,这个通常只是编辑器而已。
附录:Golang WebSocket服务日志
五、性能报告和统计
Summary Report比较简单,Jmeter可以生成html格式的详细性能报告。比如:
执行以下命令即可:
jmeter -n -t test_demo.jmx -l result.jtl -e -o /Users/xxx/Desktop/ResultReport
说明:
- -n :以非 GUI 形式运行 Jmeter
- -t :test_demo.jmx 脚本路径
- -l :result.jtl 运行结果保存路径,.jtl 文件名不能重复
- -e :在脚本运行结束后生成 HTML 报告
- -o :用于存放 HTML 报告的目录
然后,/Users/xxx/Desktop/ResultReport 目录下会生成一个html文件,用浏览器打开即可。
具体的各个报表的解释,可以参考这篇文章:Jmeter生成HTML性能测试报告
六、Jmeter上云
在裸金属服务器或者个人电脑上跑,总是会受限于物理环境或者成本的原因,导致模拟的并发有限或者不太贴近真实环境,好在各大云服务商也提供了对jmeter的支持,可以分发CSV配置文件,把Jmeter调度到不同的真实物理机上运行,从而尽可能贴近真实场景,突破物理限制。
以阿里云举例(PTS压测和JMeter压测),我提取了几个特点(详情):
- 提供JMeter插件,在本地一键启动云上分布式压测
- 流量支持动态秒级调整,百万QPS亦可瞬时脉冲
- 流量来源于全国上百城市覆盖各运营商(可拓展至海外),真实模拟最终用户的流量来源,相应的报表、数据更接近用户真实体感。
看到这里,恐怕你要直呼:这么牛逼,我怎么用得起?
其实,我们购买一台2C4G的服务器,再购买一个压测资源包(价格点这里),总成本应该在几百左右,可以作为一个进阶的备选方案。
除此之外,要实现
分布式Jmeter压测
,需要使用 CSV Data Set Config 功能,可以参考这里(https://help.aliyun.com/document_detail/91788.html)。
参考
- JMeter WebSocket Samplers - A Practical Guide
- https://www.blazemeter.com/blog/how-use-http-basic-authentication-jmeter
- 在JMeter中提取token值并传递给其它接口使用
- JMeter中各种请求格式
- Jmeter跨线程使用变量的几种方式
- Jmeter生成HTML性能测试报告
- JMeter使用CSV参数文件
- CSV Data Set Config
- jmeter使用csv进行参数化(一)
版权归原作者 Go和分布式IM 所有, 如有侵权,请联系我们删除。