locust和fastHttpLocust的测试对比
准备:
基于一个python+flask框架;
接口 /main/login 一个登录接口,请求方式是post请求,请求参数为mobile和password,请求头为headers = {"Content-Type": "application/json"};
具体代码为:
@main.route('/main/login',methods=['GET','POST'])
def login_views():
if request.method == 'GET':
return 'hello,login'
elif request.method == 'POST':
logger.info('---->'+'请求接口为/main/login')
data = request.get_json()
mobile = data.get('mobile')
password = data.get('password')
logger.info('---->'+'请求参数为 %s %s' %(mobile,password))
if (mobile is not None and password is not None) and (mobile != '' and password != ''):
user = users.query.filter_by(mobile=mobile,password=hashlib.md5(password.encode()).hexdigest()).first()
if user:
token = generate_auth_token(user.id,expiration=7200)
data = {
'msg': '登录成功',
'code': 1,
'userInfo':{
'id': user.id,
'mobile': user.mobile,
'c_time': str(user.c_time),
'user_name': user.user_name,
'org_id': user.org_id,
'roles': user.roles,
'token': token
}
}
logger.info('请求完成,返回数据为'+json.dumps(data,ensure_ascii=False))
return jsonify(data)
else:
data = {
'msg': '用户名和密码不正确',
'code': 0,
'info': None
}
logger.info('请求完成,返回数据为'+json.dumps(data,ensure_ascii=False))
return jsonify(data)
else:
data = {'code':0,'msg':'用户名或密码不能为空','info':''}
'请求完成,返回数据为'+json.dumps(data,ensure_ascii=False)
return jsonify(data)
一、locust压测
1)locust 下载 pip install locust
2) locust 具体用法,请参考官网
https://mbd.baidu.com/ug_share/mbox/page/sharePage?tk=832c0fa65537f86f66ac58b4e36e0ac2&share_url=https%3A%2F%2Fyebd1h.smartapps.cn%2Fpages%2Fblog%2Findex%3FblogId%3D88915176%26_swebfr%3D1%26_swebFromHost%3Dbaiduboxapp
3) 脚本准备
思路,为了保证测试数据可以用,我们可以把测试数据放到队列里面,先入先出的方法,请求过后,再把测试数据放入到队列里面,保证测试数据不为空;
ok,上脚本;
from locust import TaskSet, HttpUser,task
from locust import between
import json
from queue import Queue
from faker import Faker
q = Queue(maxsize=-1)
fake = Faker(locale='zh_CN')
for i in range(100):
data = {
fake.phone_number(): fake.unix_time(end_datetime=None, start_datetime=None)
}
q.put_nowait(data)
class Demo(TaskSet):
# 启动时间,每次随机等待一下2-5秒钟之间
wait_time = between(2,5)
@task
def test_register(self):
headers = {"Content-Type": "application/json"}
if q.empty():
print('数据已经取完')
else:
print(q.qsize())
data_q = q.get_nowait()
for key,value in data_q.items():
datas = {
'mobile':key,
'password': str(value)
}
data = json.dumps(datas)
print(data)
response = self.client.post('/main/login',data=data,headers=headers)
print(response.json())
q.put_nowait(data_q)
assert response.status_code == 200
class websiteUser(HttpUser):
tasks = [Demo]
min_wait = 3000
max_wait = 6000
4) 启动,使用无浏览器分布式启动,在目录下输入命令
locust -f locust_test.py --headless -u 50 -r 5 -t 5m -H http://127.0.0.1:5001 --master
命令:
--headerless 在locust2系列中是无浏览器模式
-u 是并发用户数
-r 每秒启动数
-t 压测时间
-H 是域名或者ip+端口
--master 是分布式主机的启动
从机的启动:
locust -f locust_test.py --worker --master-host=127.0.0.1
--worker 是locust 2系列中的从机 1.0 是--salve
--master-host 是主机的ip
启动过后,我们看下巅峰的时候的效果
二、fastHttpLocust的效果
1) 下载 pip install geventhttpclient
2) fastHttpLocust的具体使用
https://www.axihe.com/tools/locust/increase-performance.html
3) 脚本准备
from locust import TaskSet,task,between
from locust.contrib.fasthttp import FastHttpUser
import json
from queue import Queue
from faker import Faker
q = Queue(maxsize=-1)
fake = Faker(locale='zh_CN')
for i in range(100):
data = {
fake.phone_number(): fake.unix_time(end_datetime=None, start_datetime=None)
}
q.put_nowait(data)
class Demo(TaskSet):
wait_time = between(1,5)
def on_start(self):
self.client.headers = {"Content-Type": "application/json"}
@task
def m_d(self):
if q.empty():
print('数据已经取完')
else:
d = q.get_nowait()
for key,value in d.items():
datas = {
'mobile':key,
'password': str(value)
}
data = json.dumps(datas,ensure_ascii=False)
print(data)
res = self.client.post('/main/login',data=data,headers=self.client.headers)
q.put_nowait(d)
print(res.json())
assert res.status_code == 200
class MyLocust(FastHttpUser):
tasks=[Demo]
max_wait = 6000
min_wait = 3000
4) 启动
主:
locust -f fastHttpLocust_test.py --headless -u 50 -r 5 -t 5m -H http://127.0.0.1:5001 --master
从:
locust -f fastHttpLocust_test.py --worker --master-host=127.0.0.1
效果:
从实际效果上来看,发送请求数fastHttpLocust是locust的3-4倍;