python+Locust压力测试

pip3 install locust安装

官网: https://www.locust.io/

官方使用文档:Locust Documentation — Locust 2.15.2.dev27 documentation

Locust主要由下面的几个库构成:

1) gevent

gevent是一种基于协程的Python网络库,它用到Greenlet提供的,封装了libevent事件循环的高层同步API。

2) flask

Python编写的轻量级Web应用框架。

3) requests

Python Http库

4) msgpack-python

MessagePack是一种快速、紧凑的二进制序列化格式,适用于类似JSON的数据格式。msgpack-python主要提供MessagePack数据序列化及反序列化的方法。

5) six

Python2和3兼容库,用来封装Python2和Python3之间的差异性

6) pyzmq

pyzmq是zeromq(一种通信队列)的Python绑定,主要用来实现Locust的分布式模式运行

当我们在安装 Locust 时,它会检测我们当前的 Python 环境是否已经安装了这些库,如果没有安装,它会先把这些库一一装上。并且对这些库版本有要求,有些是必须等于某版本,有些是大于某版本。我们也可以事先把这些库全部按要求装好,再安装Locust时就会快上许多。

Locust单进程运行模式

Locust所有的虚拟并发用户均运行在单个Python进程中,具体从使用形式上,又分为no_webweb两种形式。该种模式由于单进程的原因,并不能完全发挥压力机所有处理器的能力,因此主要用于调试脚本和小并发压测的情况。

当并发压力要求较高时,就需要用到Locust的多进程分布式运行模式。从字面意思上看,大家可能第一反应就是多台压力机同时运行,每台压力机分担负载一部分的压力生成。的确,Locust支持任意多台压力机(一主多从)的分布式运行模式,但这里说到的多进程分布式运行模式还有另外一种情况,就是在同一台压力机上开启多个slave的情况。这是因为当前阶段大多数计算机的CPU都是多处理器(multiple processor cores),单进程运行模式下只能用到一个处理器的能力,而通过在一台压力机上运行多个slave,就能调用多个处理器的能力了。比较好的做法是,如果一台压力机有N个处理器内核,那么就在这台压力机上启动一个masterNslave。当然,我们也可以启动N的倍数个slave,但是根据我的试验数据,效果跟N个差不多,因此只需要启动Nslave即可。 

no_web形式启动locust:

如果采用no_web形式,则需使用--no-web参数,并会用到如下几个参数。

  • -c, --clients:指定并发用户数;
  • -n, --num-request:指定总执行测试次数;
  • -r, --hatch-rate:指定并发加压速率,默认值位1。

示例:

$ locust -f    locustfile.py     --host = xxxxx.com   --no-web -c 1 -n 2

在此基础上,当我们想要调试Locust脚本时,就可以在脚本中需要调试的地方通过print打印日志,然后将并发数和总执行次数都指定为1

$ locust -f    locustfile.py     --host = xxxxx.com   --no-web -c 1 -n 1

执行测试

通过这种方式,我们就能很方便地对Locust脚本进行调试了。

Locust脚本调试通过后,就算是完成了所有准备工作,可以开始进行压力测试了。

web形式启动locust:

如果采用web形式,,则通常情况下无需指定其它额外参数,Locust默认采用8089端口启动web;如果要使用其它端口,就可以使用如下参数进行指定。

  • -P, --port:指定web端口,默认为8089.
  •  终端中--->进入到代码目录: locust     -f    locustfile.py     --host = xxxxx.com      
  • -f            指定性能测试脚本文件
  • -host      被测试应用的URL地址【如果不填写,读取继承(HttpLocust)类中定义的host】
  • 如果Locust运行在本机,在浏览器中访问http://localhost:8089即可进入Locust的Web管理页面;如果Locust运行在其它机器上,那么在浏览器中访问http://locust_machine_ip:8089即可。
from locust import HttpUser,TaskSet,task
import json

class Demo(TaskSet):
    @task(1)
    def baidu(self):
        url = '/ywwl/item/sell/page/v2'
        body = {"pageSize":10,"pageIndex":1,"queryAllFlag":1}
        header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",'X-TOKEN':'wvdxtc1xnde1mdq=','Content-Type':'application/json;charset=UTF-8','Accept': 'application/json, text/plain, */*'}
        req = self.client.post(url, data = json.dumps(body), headers=header, verify=False)

        if req.status_code == 200:
            print("+++++++++success")
        else:
            print("---------fails")

    @task(2)
    def baidu2(self):
        print("======2======")

class websitUser(HttpUser):
    tasks = [Demo]    # task_set = Demo  #指向定义了用户行为的类Demo
    min_wait = 3000  #模拟负载的任务之间执行时的最小等待时间,单位为毫秒
    max_wait = 6000

if __name__=="__main__":
    import os
    os.system("locust -f Locust.py --host=https://test.ywwl.com --headless -u 100 -r 5 -t 30s --html HTML_FILE")  #访问地址http://localhost:8089

# --headless   禁用web界面,开始测试
# -u(-c), --clients:指定并发用户数;
# -n, --num-request:指定总执行测试次数;
# -r   指定并发加压速率,默认值位1。指定每秒启动的用户数,加至并发用户数止。
# -t   设置运行时间, 例如: (300s, 20m, 3h, 1h30m)。
# -H   设置host例如http://10.21.32.33
# --tls-cert TLS_CERT    提供TLS证书的路径
# --tls-key TLS_KEY     提供TLS私钥
# -T [TAG [TAG ...]], --tags [TAG [TAG ...]]   仅执行列表内的任务
# -E [TAG [TAG ...]], --exclude-tags [TAG [TAG ...]]   执行列表外的任务
# --csv CSV_PREFIX    存储当前请求统计到CSV文件
# --csv-full-history    存储每个统计条目到CSV文件
# --html HTML_FILE      存储HTML报表文件

断言及变更‘成功/失败’识别状态:

针对https接口,可附带证书请求:

 

补充

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值