Locust 介绍
Locust 是一个易于使用、分布式的负载测试工具,它能够对网站或其余系统进行负载测试,并计算出一个系统可以承受多少的并发用户。Locust彻底基于事件,所以能够在一台机器上支持数千名并发用户,与其余基于事件的应用相比,它不使用回调。与jmeter、loadrunner相比,Locust不须要笨重的UI或臃肿的xml,全部的用户行为都是经过手动编写代码在实现,基于协程而不是回调。不过,Locust有一个整洁的HTML用户界面,用来实时显示测试结果的相关数据。python
Locust 有如下几个特色:web
- 分布式和可扩展的-支持成千上万的用户(基于协程)
- 基于web的用户界面(具备跨平台和易于扩展的特色)
- 可控制(全部事件I/O和协程任务都委托给gevent来替代测试工具执行)
Locust安装
Locust支持版本Python2.7、3.3、3.4、3.5、3.6windows
Locust 在pypi上可用,可用经过pip或easy_install安装。浏览器
pip install locustio 服务器
或 并发
easy_install locustio分布式
安装ZeroMQ工具
若是您打算运行分布在多个进程/机器上的Locust,那就须要安装pyzmq:post
Pip install pyzmq性能
或
Easy_install pyzmq
在windows上安装locust:
在Windows上,若是正确设置了构建环境,则运行pip install locustio可能会失败。 在这种状况下,在Windows上运行Locust的最简单方法是首先为pyzmq安装预构建的二进制包(也可能为gevent和greenlet安装)。
你能够在这里找到一个非官方的预制python包集合:http://www.lfd.uci.edu/~gohlke/pythonlibs/
当您下载了预先构建的.whl文件时,可使用如下命令安装它:
pip install pyzmq 16.0.2 cp36 cp36m win32.whl
一旦你完成了,你应该可以只是pip安装locustio。在Windows上运行Locust应该能够很好地开发和测试负载测试脚本。
可是,在运行大规模测试时,建议您在Linux机器上执行此操做,由于gevent在Windows下的性能不好。
安装好后,使用locust --help 查看是否安装成功。
下面是一个简单的locustfile.py的简单示例:
from locust import HttpLocust, TaskSet def login(l): l.client.post("/login", {"username":"ellen_key", "password":"education"}) def index(l): l.client.get("/") def profile(l): l.client.get("/profile") class UserBehavior(TaskSet): tasks = {index: 2, profile: 1} def on_start(self): login(self) class WebsiteUser(HttpLocust): task_set = UserBehavior min_wait = 5000 max_wait = 9000
这里咱们定义了许多Locust任务,它们是带有一个参数的普通Python callables(一个Locust类实例)。 这些任务是在tasksattribute中的TaskSet类下收集的。 而后咱们有一个表明用户的HttpLocust类,咱们在其中定义模拟用户在执行任务之间应该等待多长时间,以及TaskSet类应该定义用户的“行为”。py:class:`TaskSet <locust.core.TaskSet>`s 能够嵌套。
HttpLocust类继承自Locust类,并添加了一个客户端属性,该属性是HttpSession的一个实例,可用于发出HTTP请求。
咱们能够经过更方便的方式声明任务的另外一种方式是使用@taskdecorator.如下代码等同于上述代码:
from locust import HttpLocust, TaskSet, task class UserBehavior(TaskSet): def on_start(self): """ on_start is called when a Locust start before any task is scheduled """ self.login() def login(self): self.client.post("/login", {"username":"ellen_key", "password":"education"}) @task(2) def index(self): self.client.get("/") @task(1) def profile(self): self.client.get("/profile") class WebsiteUser(HttpLocust): task_set = UserBehavior min_wait = 5000 max_wait = 9000
Locust类(以及HttpLocust,由于它是一个子类)也容许在执行任务(min_wait和max_wait)之间以及其余用户行为之间指定每一个模拟用户的最小和最大等待时间。
启动locust
要使用上面的Locust文件运行Locust,若是它名为locustfile.py并位于当前工做目录中,咱们能够运行:
locust --host=http://localhost.com
若是Locust文件位于子目录下和/或名称不一样于locustfile.py,请使用它来指定它 -f :
locust -f locust_files/my_locust_file.py --host=http://localhost.com
而后咱们将启动任意数量的从属进程:
locust -f locust_files/my_locust_file.py --slave --host=http://localhost.com
若是咱们想在多台机器上运行分布式Locust,咱们还必须在启动从机时指定主机(在运行分布在单台机器上的Locust时不须要这样作,由于主机主机默认为127.0.0.1):
locust -f locust_files/my_locust_file.py --slave --master-host=192.168.0.100 --host=http://localhost.com
您可能但愿经过csv文件记录您的Locust结果。 在这种状况下,有两种方法能够作到这一点:
首先,在运行Web服务器时,您能够从localhost检索csv:localhost:8089/stats/requests/csv 和 localhost:8089/stats/distribution/csv。 其次,您可使用标志运行Locust,该标志将按期保存csv文件。 若是您计划使用--no-web标志以自动方式运行Locust,这将特别有用。
locust -f locust_files/my_locust_file.py --csv=foobar --no-web -n10 -c1
若是您但愿更快(或更慢)写入,您还能够自定义写入的频率:
import locust.statslocust.stats.CSV_STATS_INTERVAL_SEC = 5 # default is 2 seconds
打开Locust的Web界面
使用上述命令行之一启动Locust后,应打开浏览器并将其指向http://127.0.0.1:8089(若是您在本地运行Locust)。 那么你应该进入这样的欢迎: