性能测试工具
谈到性能测试工具,我们首先想到的是LoadRunner或JMeter。
LoadRunner是非常有名的商业性能测试工具,功能非常强大。但现在一般不推荐使用该工具来进行性能测试,主要是使用也较为复杂,而且该工具体积比较大,需要付费且价格不便宜。
关于LoadRunner使用教程见:LoadRunner性能测试入门教程
JMeter同样是非常有名的开源性能测试工具,功能也很完善,我们之前介绍了它作为接口测试工具的使用。
Locust同样是性能测试工具,虽然官方这样来描述它:“An open source load testing tool.”,但它和前面两个工具有一些不同。
Locust简介
Locust完全基于Python编程语言,采用纯 Python描述测试脚本,并且HTTP请求完全基于Requests
库。除了HTTP/HTTPS
协议外,Locust还可以测试其他协议的系统,只需采用Python调用对应的库进行请求描述即可。
LoadRunner和JMeter这类采用进程
和线程
的测试工具,都很难在单机上模拟出较高的并发压力。Locust的并发机制摒弃了进程和线程,采用协程
(gevent)的机制。协程避免了系统级资源调度,因此可以大幅提高单机的并发能力。
扩展资料:协程—廖雪峰博客
下载安装
使用pip命令安装Locust:
1 | pip install locustio |
安装完成之后检测是否安装成功:
1 | C:\Users\Shuqing>locust -help |
测试案例
测试场景
针对如下两个接口进行性能测试:
1 | http://127.0.0.1:8000/users/ |
以上两个接口也就是我们之前项目django_restful
的接口
负载场景
- 每秒生成2个用户,总共生成60个用户。
- 负载测试5分钟然后查看接口的平均响应时间。
脚本实现
restful_api_locust.py
1 | from locust import HttpLocust,TaskSet,task |
UserBehavior类继承TaskSet类,用于描述用户行为。
@task
装饰该方法为一个事务,后面的数字表示请求比例,上面的比例为2:1
默认都是1:1
test_users()
方法表示一个用户行为,这里是请求user
接口。test_groups()
方法表示请求group
接口。client.get()
用于指定请求的路径。
WebsiteUser类用于设置性能测试。
task_set
:指向一个定义的用户行为类。min_wait
:执行事务之间用户等待时间的下界(单位:毫秒)。max_wait
:执行事务之间用户等待时间的上界(单位:毫秒)。
执行测试
使用如下命令开始启动测试1
2
3C:\Users\Shuqing>locust -f D:\api_test\locust\restful_api_locust.py --host=http://127.0.0.1:8000
[2018-07-24 15:39:22,917] LAPTOP-8B5JADC8/INFO/locust.main: Starting web monitor at *:8089
[2018-07-24 15:39:22,917] LAPTOP-8B5JADC8/INFO/locust.main: Starting Locust 0.8.1
在浏览器打开localhost:8089
可以看到如下页面:
- Number of users to simulate:设置模拟用户数。
- Hatch rate(users spawned/second):每秒产生(启动)的虚拟用户数。
- 单击“Start swarming”按钮,开始运行性能测试
运行之后可以看到主界面如下:
性能测试参数如下。
- Type:请求的类型,例如GET/POST。
- Name:请求的路径。
- request:当前请求的数量。
- fails:当前请求失败的数量。
- Median:中间值,单位毫秒,一半的服务器响应时间低于该值,而另一半高于该值。
- Average:平均值,单位毫秒,所有请求的平均响应时间。
- Min:请求的最小服务器响应时间,单位毫秒。
- Max:请求的最大服务器响应时间,单位毫秒。
- Content Size:单个请求的大小,单位字节。
- reqs/sec:每秒钟请求的个数。
点击 Charts
菜单可以查看性能图表
图表含义如下:
- Total Request per Second :每秒的请求数
- Average Response Time: 平均响应时间
- Number of Users: 用户数
参数化
测试场景
如果想对如下接口进行并发测试,则可以将id
进行参数化设置
1 | http://127.0.0.1:8000/groups/1/ |
代码实现
locust_users_groups.py1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from locust import HttpLocust,TaskSet,task
class UserBehavior(TaskSet):
def on_start(self):
#设置user和group参数下标初始值
self.users_index=0
self.groups_index=0
def test_users(self):
#读取参数
users_id=self.locust.id[self.users_index]
url="/users/"+str(users_id)+'/'
self.client.get(url,auth=('51zxw','zxw20182018'))
#取余运算循环遍历参数
self.users_index=(self.users_index+1)%len(self.locust.id)
def test_groups(self):
#参数化
groups_id=self.locust.id[self.groups_index]
url="/groups/"+str(groups_id)+"/"
self.client.get(url,auth=('51zxw','zxw20182018'))
self.groups_index=(self.groups_index+1)%len(self.locust.id)
class WebsiteUser(HttpLocust):
task_set = UserBehavior
#参数配置
id=[1,2]
min_wait = 3000
max_wait = 6000
#host配置
host = 'http://127.0.0.1:8000'
运行结果
执行如下命令即可运行测试
1 | C:\Users\Shuqing>locust -f D:\api_test\locust\locust_users_groups.py |
运行模式
no-web运行
前面是通过登录web来运行测试的,其实也可以非web状态来运行,如cmd命令来运行。
如果需要非Web形式运行,则需使用--no-web
参数,并会用到如下几个参数。
-c, --clients
:指定并发用户数;-r, --hatch-rate
:指定并发加压速率,默认值位1。-t, --run-time
:设置运行时间。如(300s,20m, 3h, 1h30m等);
运行命令如下:
1 | locust -f D:\api_test\locust\locust_users_groups.py --no-web -c 10 -r 2 -t 15s |
运行结果如下:
1 | C:\Users\Shuqing>locust -f D:\api_test\locust\locust_users_groups.py --no-web -c 10 -r 2 -t 15s |
分布式运行
上面我们都是单台机器来执行性能测试,但是当单台机器不够模拟足够多的用户时,Locust支持运行在多台机器中进行压力测试。分布式运行一般是一台master
多台slave
如下图所示:
首先定义一台 master
1 | C:\Users\Shuqing>locust -f D:\api_test\locust\locust_users_groups.py --master |
然后定义 slave
1 | C:\Users\Shuqing>locust -f D:\api_test\locust\locust_users_groups.py --slave |
如果slave
与master
不在同一台机器上,还需要通过--master-host
参数再指定master
的IP地址。
1 | C:\Users\Shuqing>locust -f D:\api_test\locust\locust_users_groups.py --slave --master-host <master_ip> |
运行之后可以看到web界面显示的SLAVES
数量