概述
locust是一个用python写的可分布式部署、模拟大量用户同时请求你的web系统或其他系统从而进行压力测试的框架。locust,中文蝗虫,蝗虫过境,寸草不生。估计作者也是这个意思。
对于压力测试的要点,引用一位网友的观点:
服务端性能测试工具最核心的部分是压力发生器,而压力发生器的核心要点有两个,一是真实模拟用户操作,二是模拟有效并发
那locust是怎么做到这两点的呢?
locust github上的介绍如下:
Locust is an easy-to-use, distributed, user load testing tool. It is intended for load-testing web sites (or other systems) and figuring out how many concurrent users a system can handle.
The idea is that during a test, a swarm of locusts will attack your website. The behavior of each locust (or test user if you will) is defined by you and the swarming process is monitored from a web UI in real-time. This will help you battle test and identify bottlenecks in your code before letting real users in.
Locust is completely event-based, and therefore it's possible to support thousands of concurrent users on a single machine. In contrast to many other event-based apps it doesn't use callbacks. Instead it uses light-weight processes, through gevent. Each locust swarming your site is actually running inside its own process (or greenlet, to be correct). This allows you to write very expressive scenarios in Python without complicating your code with callbacks.
概括一下有以下几个特点:
简单易用,只需要用
python
写脚本代码,在代码中去定义用户行为,然后以命令行方式启动脚本代码即可。不像有些测试工具需要操作软件录制脚本或者配置复杂的xml文件。嗯,jmeter
也是很优秀的开源工具,不然也不会那么受欢迎,但是总觉得有些傻瓜,也不够灵活,😜。在模拟有效并发方面,
locust
的优势在于其摒弃了进程和线程,完全基于事件驱动,使用gevent
提供的非阻塞IO
和coroutine
来实现网络层的并发请求。可以分布式部署,单台机器可以模拟数千用户,也就是说如果有几十台机器,那同时在线用户数可以模拟到百万级,对绝大多数中小公司来说够用了。
压测过程中可以通过一个
web
系统实时查看系统的表现,还有数据及图表结果,能导出csv格式的结果文件。
基本的使用方法
第一步:安装locust
首先确保你电脑上已经安装了python
开发环境,3.6
及以上版本,我目前用的3.7.3
版本。
然后可以按照官网的安装说明安装,不同的系统平台会有差异,以MacOS
系统为例,打开terminal
,先安装libev
依赖:
brew install libev
然后用pip安装locust:
pip3 install locust
用locust --help
测试一下:
出现上图说明安装成功。
第二步:写脚本代码
先上示例代码,后面会简单介绍
from locust import HttpLocust,TaskSet,between,task
class WebsiteTasks(TaskSet):
def on_start(self):
self.client.post("/login", {
"username": "test",
"password": "123456"
})
@task(2)
def index(self):
self.client.get("/")
@task(1)
def about(self):
self.client.get("/about/")
def on_stop(self):
print("stop")
class WebSiteUser(HttpLocust):
task_set = WebsiteTasks
host = "http://192.168.31.180"
wait_time = between(1, 2)
在这个示例中,定义了针对http://192.168.31.180
网站的测试场景:先模拟用户登录系统,然后随机地访问首页(/
)和关于页面(/about/
),请求比例为2:1
;并且,在测试过程中,每一个模拟出来的用户的两次请求的间隔时间为1~2
秒间的随机值。
示例脚本主要包含两个类,一个是WebsiteUser
(继承自HttpLocust
,而HttpLocust
继承自Locust
),另一个是WebsiteTasks
(继承自TaskSet
)。事实上,在Locust
的测试脚本中,所有业务测试场景都是在Locust
和TaskSet
两个类的继承子类中进行描述的。
测试开始后,每个虚拟用户(Locust实例
)的运行逻辑都会遵循如下规律:
- 先执行
WebsiteTasks
中的on_start
(只执行一次),作为初始化; - 从
WebsiteTasks
中随机挑选(如果定义了任务间的权重关系,那么就是按照权重关系随机挑选)一个任务执行; - 根据
Locust
中wait_time
定义的间隔时间范围(如果TaskSet类
中也定义了wait_time
,以TaskSet
中的优先),在时间范围中随机取一个值,休眠等待; - 重复
2~3
步骤,直至测试任务终止。
第三步:脚本调试
正式开始前有必要先调试一下脚本,看看报不报错。可以先通过下面这种单机下no-web
的形式调试,-f
是指定脚本文件名称,-c是指并发用户数量,-r
是启动虚拟用户的速率。
locust -f locustfile.py --no-web -c 1 -r 1
如果没有报错,terminal中会打印类似下面的日志信息(因为我的host没开,所以各个结果都是0)
第四步:执行测试
因为我只做了单机单进程模式的测试,所以就不写单机多进程、多机多进程多的测试方法了,毕竟没有亲身实践过的东西咱不能乱说,以后如果用到,再写。
另外我就以默认的web ui based
的方式做,这样结果看起来更直观。上面第三步no-web
的形式我们也看到了。
在terminal以如下命令启动locust
,通常情况下不需额外指定其他参数:
locust -f locustfile.py
Locust
默认采用8089
端口启动web
,如果要使用其它端口,就可以使用如下参数进行指定:
locust -f locustfile.py --port 8089
启动成功后测试并没有开始,还需要在下面的web页面中设置好几个参数。
如果Locust
运行在本机,在浏览器中访问http://127.0.0.1:8089
即可进入Locust
的Web管理页面;如果Locust
运行在其它机器上,那么在浏览器中访问http://locust_machine_ip:8089
即可。
因为host的地址我已经在脚本中写好了,所以会直接显示在这上面,如果脚本中没写,也可以在这里写。现在只需要设置前两个参数:
Number of total users to simulate
: 设置并发用户数,对应no_web
模式的-c
参数Hatch rate (users spawned/second)
: 启动虚拟用户的速率,对应着no_web
模式的-r
参数
参数配置完毕后,点击【Start swarming】即可开始测试。
这里我把并发用户数设为100,生成模拟用户的速率设为1,那开始后,就会先有一个动态的用户数量爬坡增长的过程,增长的过程中,每个产生的用户会按照脚本定义的行为去请求网站地址或者接口地址,然后等用户数量增长到100后,对系统的请求数也会维持在一个基本稳定的范围里。
虚拟用户产生的过程如下:
Locust
的结果展示十分简单,主要就四个指标:并发数
、RPS
、响应时间
、异常率
。但对于大多数场景来说,这几个指标已经足够了。
测试完成后,可以查看图表结果,也可以下载csv格式的文件。
总结
本文只是基本的介绍了一下locust,和基础的使用方法。高阶的用法还需要配合实战进行研究使用。