Locust 使用Python代码来定义用户行为,用它可以模拟百万级的并发用户来访问系统。
与其他性能工具对比如下:
LoadRunner |
商业性能测试工具,报告完整,不支持二次开发 开发语言:C/Java 并发机制:进程/线程 |
Jmeter |
开源性能测试工具,简单报告,支持二次开发。 开发语言:Java 并发机制:线程,需要在UI界面上通过选择组件来编写脚本,模拟的负载是线程绑定的, 模拟的每个用户都需要一个单独的线程,单台负载机可模拟的负载数有限。 |
Locust |
开源性能测试工具,简单报告,支持二次开发。 开发语言:python 并发机制:协程,LoadRunner和Jmeter这类采用进程和线程的测试工具,很难在单机 上模拟出较高的并发压力。Locust的并发机制摒弃了进程和线程,采用协程(gevent) 机制。协程避免了系统级资源调度,由此可以大幅提高单机的并发能力。 |
locust的安装
# 1. 命令行安装
pip3 install locust
# 2. 直接在pycharm中导入
# 3. github下载安装 https://github.com/locustio/locust/ clone后执行setup.py文件
python setup.py install
# 检查是否安装成功
locust --help
locust版本信息、python版本以及依赖库如下查询:
gevent 是在python中实现协程的第三方库,协程又叫微线程Coroutine。
flask 是python 的一个web开发框架。
requests 是python中可进行http(s)请求的操作库。
msgpack 是一种快速、紧凑的二进制序列化格式,适用于类似Json的数据。
six提供了一些简单的工具用来封装Python2和Python3之间的差异性。
pyzmq 可用于Locust分布运行在多个进程/机器上。
实现例子及用法注释
访问博客首页例子
# coding:utf-8 from locust import HttpLocust, TaskSet, task import urllib3 """ 使用Python3 requests发送HTTPS请求,已经关闭认证(verify=False)情况下,控制台会输出以下错误, 忽略报错的方法如下: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings """ urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) class UserBehavior(TaskSet): # UserBehavior类,继承了TaskSet类,用于定义测试任务的 header = { "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36"} # on_start 相当于任务开始的入口,可进行初始化,此处省略了实现 def on_start(self): pass # @task()装饰的方法为一个事务。方法的参数用于指定该行为的执行权重。参数越大每次被虚拟用户执行的概率越高。如果不设置默认为1 @task(1) def cnblogsHome(self, header): request = self.client.get("/", headers=header, verify=False) @task(2) def cnblogsHome(self, header): request = self.client.get("/belle-ls/", headers = header, verify = False) class websitUser(HttpLocust): """ HttpLocust类继承了HttpSession类,HttpSession使用率requests.Session,所以用client方法请求登录后,会保存登录状态,具有session记忆功能 """ task_set = UserBehavior #Task_set属性,它是唯一必须要有的,它指向Task Set类,定义用户的行为 min_wait = 3000 #请求等待最小时间 max_wait = 6000 #请求等待最大时间 # 每个用户执行两个任务间隔时间的上下限(毫秒),具体数值在上下限中随机取值,若不指定则默认间隔时间固定为1秒 # host:被测系统的host,当在终端中启动locust时没有指定--host参数时才会用到 # weight: 一个Locust实例被挑选执行的权重,数值越大,执行频率越高 # stop_timeout: 设置 Locust 多少秒后超时,如果为 None ,则不会超时。 if __name__ == "__main__": import os os.system("locust -f locustDemo.py --host=https://www.cnblogs.com")
@task装饰器和tasks属性:以下两种写法是等价的
from locust import TaskSet, task
class UserBehavior(TaskSet):
@task
def job1(self):
self.client.get('/job1')
@task
def job2(self):
self.client.get('/job2')
####################################
from locust import TaskSet
def job1(obj):
obj.client.get('/job1')
def job2(obj):
obj.client.get('/job2')
class UserBehavior(TaskSet):
tasks = [job1, job2]
# 或者指定执行频率 tasks = {job1:1, job2:1}
执行脚本,locust启动。
web模式:如果Locust
运行在本机,在浏览器中访问http://localhost:8089
即可进入Locust
的Web管理页面;如果Locust
运行在其它机器上,那么在浏览器中访问http://locust_machine_ip:8089
即可
web模式执行过程如下:
按钮:
Edit:点击该按钮可对模拟的总虚拟用户和每秒启动的虚拟用户数进行重新设定
STOP:停止运行,缺点----locust只能手动停止,无法自动停止
locust运行命令
"""
web模式运行
-f 指定脚本的绝对路径 --host指定被测接口的服务主机
"""
locust -f load_test.py --host=https://www.baidu.com
"""
--no-web模式运行
-c 设置虚拟用户数
-r 设置每秒启动虚拟用户数
-t 设置运行时间
"""
locust -f load_test.py --host=https://www.baidu.com --no-web -c 10 -r 2 -t 1m
"""
分布式运行Locust,如果是--no-web模式运行,master会等待slave机器节点接入后运行
--master 设置locust为master模式,网页交互会在这台节点机器中运行
--slave 设置locust的slave模式
--master-host 如果是本机多进程运行,可省略
"""
locust -f load_test.py --master
locust -f load_test.py --slave --master-host = 192.168.1.110
参数说明:
1 -h, –help:查看帮助 2 -H HOST, –host=HOST:指定被测试的主机,采用以格式:http://192.168.1.110 3 –web-host=WEB_HOST:指定运行 Locust Web 页面的主机,默认为空 4 -P PORT, –port=PORT, –web-port=PORT:指定 –web-host 的端口,默认是8089 5 -f LOCUSTFILE, –locustfile=LOCUSTFILE:指定运行 Locust 性能测试文件,默认为: locustfile.py 6 –csv=CSVFILEBASE, –csv-base-name=CSVFILEBASE:以CSV格式存储当前请求测试数据 7 –master:Locust 分布式模式使用,当前节点为 master 节点 8 –slave:Locust 分布式模式使用,当前节点为 slave 节点。 9 –master-host=MASTER_HOST:分布式模式运行,设置 master 节点的主机或 IP 地址,只在与 –slave 节点一起运行时使用,默认为:127.0.0.1 10 –master-port=MASTER_PORT:分布式模式运行, 设置 master 节点的端口号,只在与 –slave 节点一起运行时使用,默认为:5557。注意,slave 节点也将连接到这个端口+1 上的 master 节点。 11 –master-bind-host=MASTER_BIND_HOST:master运行模式需要设置host,默认是* 所有有效接口 12 –master-bind-port=MASTER_BIND_PORT:应该设置master端口号(只用于master执行是),默认5557. 也会使用这个端口+1的端口,所以默认master会被连接到5557和5558两个端口 13 –expect-slaves=EXPECT_SLAVES:开始测试之前期望多少个slave节点接入 (只–no-web模式). 14 –no-web:no-web 模式运行测试,需要 -c 和 -r 配合使用. 15 -c NUM_CLIENTS, –clients=NUM_CLIENTS:指定并发用户数,作用于 –no-web 模式 16 -r HATCH_RATE, –hatch-rate=HATCH_RATE:指定每秒启动的用户数,作用于 –no-web 模式。 17 -t RUN_TIME, –run-time=RUN_TIME:设置运行时间, 例如: (300s, 20m, 3h, 1h30m). 作用于 –no-web 模式。 18 -L LOGLEVEL, –loglevel=LOGLEVEL:选择 log 级别(DEBUG/INFO/WARNING/ERROR/CRITICAL). 默认是 INFO. 19 –logfile=LOGFILE:日志文件路径。如果没有设置,日志将去 stdout/stderr 20 –print-stats:在控制台中打印数据 21 –only-summary:只打印摘要统计 22 –no-reset-stats:执行完后不重新设定 23 -l, –list:显示测试类, 配置 -f 参数使用 24 –show-task-ratio:打印 locust 测试类的任务执行比例,配合 -f 参数使用. 25 –show-task-ratio-json:以 json 格式打印 locust 测试类的任务执行比例,配合 -f 参数使用 26 -V, –version:查看当前 Locust 工具的版本.