简介: java
Locust是一个用于可扩展的,分布式的,性能测试的,开源的,用Python编写框架/工具,它很是容易使用,也很是好学。它的主要思想就是模拟一群用户将访问你的网站。每一个用户的行为由你编写的python代码定义,同时能够从Web界面中实时观察到用户的行为。python
Locust彻底是事件驱动的,所以在单台机器上可以支持几千并发用户访问。与其它许多基于事件的应用相比,Locust并不使用回调,而是使用gevent,而gevent是基于协程的,能够用同步的方式来编写异步执行的代码。每一个用户实际上运行在本身的greenlet中。linux
特色:web
①用简单python语言编写测试脚本,很是简单轻便。不须要笨重的UI和臃肿的xml代码,基于协同而非回调。shell
②分布式的,可扩展性的,可模拟上百万用户。Locust支持多机器的性能测试,每台机器能够模拟上千用户,固然这能够控制的,windows
③Locust有一个整洁的HTML+JS的用户界面,实时显示相关测试细节。因为用户界面是基于网络的,它是跨平台的和容易扩展。网络
④能够测试任何系统,尽管Locust是基于网站的,但它几乎能够测试任何系统,只要你写一个客户端。session
安装:并发
Locust能够经过pip或者easy_install安装:框架
pip install locustio
或者
easy_install locustio
安装完Locust后,shell命令locust就可使用了,能够查看locust命令有哪些选项:
(注意,要确保你安装好了python,版本必须是2.6以上的,但不能是3.0版以上的,3.0以上的改动好大,还无法兼容)
locust --help
若是打算以分布式模式运行Locust,建议同时安装pyzmq(一种通讯队列):
pip install pyzmq
或者
easy_install pyzmq
在windows上安装:
下载二进制安装包,而后按照提示安装
网址:http://www.lfd.uci.edu/~gohlke/pythonlibs/
须要注意的是,当须要大规模的测试时,安装在Linux上的性能比windows上的好。
在苹果电脑上安装:
①先安装Homebrew
②安装libevent
brew install libevent
③参照在linux上的安装过程。
增长打开文件限制的最大数量:
在每个HTTP链接的机器上打开一个新文件(技术文件描述符)。操做系统能够设置一个能够打开的文件的最大数量的下限。若是限制小于模拟用户的数量,在测试时,会发生故障。增长操做系统的默认最大数量的文件限制到一个数字高于模拟用户数的数量,才能达到你想要的测试,具体操做参考本机的操做系统。
快速启动:
下面是一个简单的列子,保持为python文件,文件名随意
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
这个几行短短的代码就是一个完成的测试脚本。定义了两个类,一个User Behavior类,继承了TaskSet类,用于定义测试任务的,给属性tasks增长了两个任务,index函数和profile函数,这些人物被执行,而后返回执行时间,正常状况下,是在下面的最小时间和最大时间之间,从on_start 开始,就像java的main函数同样,是任务开口,而后随机的挑选任务,经过client(至关于一个Httpsession)的方法执行http请求,可是会按照设置的比率来执行。Tasks属性把上面定义的函数变成任务,它是一个dict类型。至关于java的map类型。
一个WebsiteUser类,继承了HttpLocust类,这个类用于表明用户,生成一个实例,为每一个每一个模拟用户,发送http请求和设置测试参数,Task_set属性,它是惟一必需要有的,它指向Task Set类,定义用户的行为,请求等待最小时间min_wait和请求等待最大时间max_wait属性,单位是毫秒。,weight属性指定用户的执行的比率,host属性是测试的应用的网址。
注意最大时间和最小时间属性能够在locust类中定义,也能够在task set类中定义,彻底是同样的
下面是一种更简单的定义task的方法,用@task 构造器。下面的代码和上面的效果是同样的:但这是顺序执行任务的,第一种是随机挑选任务
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
TaskSet还能够嵌套:参考下面的代码
第一种:
class ForumPage(TaskSet):
@task(20)
def read_thread(self):
pass
@task(1)
def new_thread(self):
pass
@task(5)
def stop(self):
self.interrupt()
class UserBehaviour(TaskSet):
tasks = {ForumPage:10}
@task
def index(self):
pass
第一种须要注意的是interrupt这个函数,若是没有这个函数locust就会一直执行formpage这个任务,只有经过这个函数,才能跳出来。执行formpage以外的函数。
第二种:
class MyTaskSet(TaskSet):
@task
class SubTaskSet(TaskSet):
@task
def my_task(self):
pass
运行Locust:
locust -f ../locust_files/上面的文件名.py --host=http://example.com
代码存放地址 主机的名字和应用
分布式多处理器的Locust运行:
主处理器,负责分发任务的
locust -f ../locust_files/上面的文件名.py --master --host=http://example.com
--master-port=8888(默认的是8080端口)
从处理器,负责执行代码脚本的
llocust -f ../locust_files/上面的文件名.py --slave --master-host=192.168.0.100 --host=http://example.com --master-bind-host=8888
打开Locust web 界面
因为example是在本地的,因此ip也是本地的
须要输入模拟多少个用户数和每秒启动多少个用户,就是并发数。