0
点赞
收藏
分享

微信扫一扫

locust和fastHttpLocust的对比

书坊尚 2022-03-26 阅读 45

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  

启动过后,我们看下巅峰的时候的效果

locust和fastHttpLocust的对比_locust

二、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

效果: 

locust和fastHttpLocust的对比_locust_02

从实际效果上来看,发送请求数fastHttpLocust是locust的3-4倍;


举报

相关推荐

0 条评论