之前用tsung做过性能测试,但是要用xml去配置接口参数,而且对字符的转义也做得不是很友好。 后来听说有个locust性能测试工具很强大,于是在家试了一下。 目前Locust只支持python2

首先我用Flask写了一个简单的接口,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# coding: utf-8
from flask import Flask, request,jsonify
app = Flask(__name__)
@app.route('/')
@app.route('/learn_locust',methods=['GET','POST'])
def locust_test():
_id = request.args.get('username')
rv = {"code": {"data": {"username": _id, "created": "2017-02-19 18:00:00"}}}
error = {"code":{"data":{"error":"not good"}}}
if _id == 'bb8':
return jsonify(rv)
else:
return jsonify(error)
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True, port=5000)

启动flask服务,然后调用一下:

1
curl http://localhost:5000/learn_locust\?username=bb8

发现返回如下图:

屏幕快照 2017-02-19 下午12.25.11

嗯。 没有问题,接下来就是写locust脚本。脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
from locust import HttpLocust, TaskSet, task
'''
首先从locust类中导入HttpLocust类,这个类用来做http协议的请求
然后再导入TaskSet类,定义一组用户要执行的任务集。这个类会执行用户的task属性的任务。TaskSet可以被嵌套,一个TaskSet的task装饰器可以嵌套另一个TaskSet。
TaskSet在执行task过程中的时候会有一个最小和最大等待时间,min_wait和max_wait参数。
task类,是可以很方便的让我们用装饰器去为TaskSet声明一个事务,他可以带上一个权重参数,如果权值越高,那么被选中的概率就越大
'''
class UserBehavior(TaskSet):
def on_start(self):
''' on_start is called when a Locust start before any task is scheduled '''
self.gslb()
@task()
def gslb(self):
url = self.locust.host + '/learn_locust'
''' 设定好url, headers和url的参数'''
headers = {
'User-Agent': 'Dalvik/1.6.0 (Linux; U; Android 4.4.4; HM NOTE 1S MIUI/7.2.9)',
'Connection': 'Keep-Alive',
'Accept-Encoding': 'gzip',
}
params = {
'username': 'bb8'
}
self.response = self.client.request(
method='GET',
url=url,
headers=headers,
params=params,
)
### Additional tasks can go here ###
class WebsiteUser(HttpLocust):
task_set = UserBehavior
min_wait = 1000
max_wait = 3000

然后将上述文件命令为locustfile.py, 接着执行

1
locust --host=http://localhost:5000

如果你的文件名不是locustfile.py, 那么你要加个参数-f, 如下

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

执行完后,你会看到屏幕快照 2017-02-19 下午12.55.05

然后打开webui地址:

1
http://127.0.0.1:8089/

你会首先要求设置下并发用户数和用户加载策略,我设置的是10个用户并发,然后Hatch Rate是每秒启动多少用户的意思, 如果设置为10,就是同时启动10个了。点击start swarming 会看到如下图

屏幕快照 2017-02-19 下午12.57.09

其中, Average为平均响应时间的测试指标,最后一列的reqs/sec相当TPS,Locust叫做rps。

在停掉python命令后,也可以看到一些测试数据:

屏幕快照 2017-02-19 下午1.02.55

如果不喜欢web界面,也可以这样去执行

1
locust --host=http://localhost:5000 --no-web -c 1 -n 4

-c是指并发数,-n是执行的次数。再配合代理,调试也不复杂。

Locust也可以做分布式执行,需要装一个pyzmq。

性能测试首先而在于分析性能测试的需求,设计性能测试场景,尽可能的模拟真实环境中的压力(正常和异常情况)。然后结果是考察并发用户数、响应时间、tps这类指标吧。