Jusene's Blog

Locust 性能测试框架

字数统计: 1k阅读时长: 4 min
2017/12/17 Share

Locust

Locust是一个可扩展,分布式,性能测试的由python编写框架,非常容易使用,也非常好学。它的主要思想就是模拟一群用户访问你的网站,每个用户的行为由你编写的python代码定义,同时可以从web界面中实时观察到用户的行为。
Locust完全是事件驱动,因此在单台机器上能够支持上千的并发访问,具体取决与你的机器性能,Locust并不支持回调,而是使用gevent,而gevent是基于协程,可以用同步的方式来编写异步执行的代码。

安装使用Locust

安装

1
~]# pip install -U locustio

注: 增加打开文件的最大数量
在每个HTTP连接的机器上打开新文件(文件描述符),操作系统可以设置一个可以打开的文件的最大数量,如果在测试的时候小于模拟数量的用户,会发生故障。

配置

只需要创建一个名为locustfile.py文件,为你的测试任务进行所有配置,并在其中进行测试。

1
from locust import HttpLocust, TaskSet
2
def login(l):
3
    l.client.post("/login", {"username":"jusene", "password":"password"})
4
def index(l):
5
    l.client.get("/")
6
def profile(l):
7
    l.client.get("/profile")
8
class UserBehavior(TaskSet):
9
    tasks = {index:2, profile:1}
10
    def on_start(self):
11
        login(self)
12
class WebsiteUser(HttpLocust):
13
    task_set = UserBehavior
14
    min_wait=5000
15
    max_wait=9000

定义两个类,一个UserBehavior类,继承TaskSet类,用于定义测试任务,给属性tasks增加了两个任务,index函数和profile函数,这些任务被执行,然后返回执行时间,正常情况下,是在下面最小时间和最大时间之间,从on_start开始,是任务的开始,然后随机的挑选任务,通过client(相当于一个Httpsession)的方法执行http请求,但是会按照设置的比率来执行。Tasks属性把上面定义的函数变成任务,它是一个dict类型。
一个WebsiteUser类,继承了HttpLocust类,这个类用于代表用户,生成一个实例,为每个每个模拟用户,发送http请求和设置测试参数,task_set属性,它是唯一必须要有的,它指向Task Set类,定义用户的行为,请求等待最小时间min_wait和请求等待最大时间max_wait属性,单位是毫秒。

注意最大时间和最小时间属性可以在locust类中定义,也可以在task set类中定义,完全是一样的。

更简单的定义task的方法,用@task 构造器。下面的代码和上面的效果是一样的:但这是顺序执行任务的,第一种是随机挑选任务

1
from locust import HttpLocust, TaskSet, task
2
class UserBehavior(TaskSet):
3
    def on_start(self):
4
    """ on_start is called when a Locust start before any task is scheduled """
5
        self.login()
6
    def login(self):
7
        self.client.post('/login',{"username":"jusene","password":"password"})
8
9
    @task(2)
10
    def index(self):
11
        self.client.get('/')
12
    @task(1)
13
    def profile(self):
14
        self.client.get('/profile')
15
16
class WebsiteUser(HttpLocust):
17
    task_set=UserBehavior
18
    min_wait=5000
19
    max_wait=9000

TaskSet还可以嵌套:

1
class ForumPage(TaskSet):
2
    @task(20)
3
    def read_thread(self):
4
        pass
5
    @task(1)
6
    def new_thread(self):
7
        pass
8
    @task(5)
9
    def stop(self):
10
        self.interrupt()
11
class UserBehaviour(TaskSet):
12
    tasks={ForumPage:10}
13
    @task
14
    def index(self)
15
        pass

第一种需要注意的是interrupt这个函数,如果没有这个函数locust就会一直执行formpage这个任务,只有通过这个函数,才能跳出来,执行formpage之外的函数。

1
class MyTaskSet(TaskSet):
2
    @task
3
    class SubTaskSet(TaskSet):
4
        @task
5
        def my_task(self):
6
            pass

运行Locust

1
locust -f locustfile.py --host=http://example.com

分布式多处理器Locust运行:
分布式运行,需要安装pyzmq,进程间通信:

1
pip install pyzmq

主处理器,负责分发任务:

1
locust -f locustfile.py --master --host=http://example.com --master-port=8888(默认8080)

从处理器,负责执行代码脚本:

1
locust -f locustfile.py --slave --master-host=10.211.55.6 --host=http://example.com --master-bind-host=8888

打开Locust web界面:http://127.0.0.1:8089

需要输入模拟多少用户数和每秒启动多少用户,Locust往坏处用,也可以理解是cc攻击框架,工具本身设计没错,关键还是在用的人。

CATALOG
  1. 1. Locust
  2. 2. 安装使用Locust
    1. 2.1. 安装
    2. 2.2. 配置
  3. 3. 运行Locust