Locust详解

安装

  1. 安装:pip install locust
  2. 查看安装:locust -v

概念

  1. 概念:Locust是一种易于使用、可编写脚本、可扩展性能测试工具。
  2. 主要思想:Locust通过模拟一群用户将访问网站,每个用户的行为可通过python编写定义,同时可以从web界面中实时观察到用户的行为。

特点

  1. 不需要编写笨重的UI或者臃肿的xml代码,基于协程而不是回调,脚本编写简单易读。
  2. 有一个基于web简洁的html+js的UI用户界面,可以实时显示相关的测试结果。
  3. 支持分布式测试,用户界面基于网络,因此具有跨平台且易于扩展的特点。
  4. 所有繁琐的I/O和协同程序都被委托给gevent(高性能的python并发框架),替代其他的工具的局限性。

Locust和Jmeter的区别

  1. Jmeter:需要在UI界面上通过选择组件来“编写”脚本,模拟的负载是线程绑定的,使用的是线程。
  2. Locust:通过编写简单易读的python代码完成测试脚本,基于时间,同样配置下,单台负载机可模拟的负载数远超jmeter(协程更小,负载数远超jmeter的使用)。
  • 缺点:其本身对测试过程的监控和测试结果展示,不如jmeter全面和详细,需要进行二次开发才能满足越来越复杂的性能测试需求。

组成

  1. 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环境是否已经安装了这些库,如果没有安装,它会先把这些库一一装上。

结构

from locust import HttpUserfrom locust import TaskSetfrom locust import task


#定义任务集
class Demo(TaskSet):
    """继承   定义任务类"""
    def on_start(self):
        print("开始执行")

    #定义任务
    @task(2)    # 指定任务权重
    def bai_du(self):
        url = "/"  # 请求路径,除了主机地址后面的请求路径,主机地址可以在用户类里定义
        res = self.client.get(url, verify=False)  # 请求路径+去掉https认证    因为是https协议,verify=False去掉认证
        if res.status_code == 200:  # 判断响应状态码是否为200,200返回成功
            print("success")
        else:
            print("failed")

#定义用户类
class WebSitUser(HttpUser):
    """继承   定义用户类,访问用户"""
    tasks = [Demo]      # 指定任务类
    host = "https://www.baidu.com"  # 指定主机地址
    min_wait = 2000
    max_wait = 3000 # 指定思考时间,3s到2s之内随机选取一个时间充当思考时间

if __name__ == '__main__':
    import os
    os.system("locust -f demo.py")"""
# 通过os模块运行,这里相当于cmd终端直接执行:locust -f demo.py
  locust脚本运行的时候打开浏览器输入:http://localhost:8089/      登录locust web页面

原理

  • 问:为什么locust可以识别写的代码和运行?
  • 答:Locust基于TaskSet和HttpUser两个类,继承两个类才能实现模拟用户行为。
  1. TaskSet类:locust里面的类继承TaskSet类,写一个类继承这个类之后locust1才可以识别它。这个类主要是模拟请求的行为,任务主要是为了模拟用户端请求信息,@task装饰器让locust识别到哪个是我们的任务模拟用户的行为。
  2. HttpUser类:locust里的类继承HttpUser类,用户类,这个类主要是写一些用户的配置信息,比如Host主机地址,思考时间等一系列信息,通过继承HttpUser类实现。
  • 两个类的桥梁:用户类中的tasks=[TaskTest],用户信息有哪些任务,指向任务类,两类就可以连通了。这两类又继承locust里面的类,所以locust命令也能去识别他们的信息。

Locust类属性详解

  1. client属性:client对应着虚拟用户作为客户端所具备的请求能力,也就是我们常说的请求方法(client模拟客户端请求)。调用方法也会requests完全一致。由于requests.Session的使用,因此client的方法调用之间就自动具有了状态记忆的功能。
  2. tasks属性:task哪些任务,继承了任务类,才能够去跑取locust请求。
  3. max_wait/min_wait:每个用户执行两个任务间隔时间的上下限(毫秒),具体数值在上下限中随机取值,若不指定则默认间隔时间固定为1s。
  4. host:被测系统的host,当在终端中启动locust时没有指定--host参数时才会用到。(主机地址或域名)
  5. weight:同时运行多个locust类时会用到,用于不同类型任务的执行权重。(权重越大跑的越多)

执行

每个虚拟用户(实例)的运行逻辑遵循规律:

  1. 先执行继承taskset任务类里面有个on_start方法(只执行一次),作为初始化。
  2. 从继承taskset中随机挑选一个任务执行(如果定义了任务间的权重关系,那么就是按照权重关系随机挑选)。
  3. 根据Locust类中min_wait和max_wait定义的间隔时间范围(如果TaskSet类中也定义min_wait或者max_wait,以TaskSet中的优先),思考时间在时间范围中随机取一个值,休眠等待。
  4. 重复2-3步骤,直至测试任务终止。

运行和结果

  1. 运行方式:在终端输入命令行(根据实际需求选择命令行参数)
  2. locust脚本运行后打开浏览器输入:http://localhost:8089/ ,输入相应信息,点击开始。
  3. ​运行结果界面
  • Type: 请求的类型,例如GET/POST。
  • Name:请求的路径。
  • request:当前请求的数量。
  • fails:当前请求失败的数量。
  • Median:中间值,单位毫秒,一半的服务器响应时间低于该值,而另一半高于该值。
  • 90%ile (ms): 90%的平均响应时间。
  • 99%ile (ms): 99%的平均响应时间。
  • Average:平均值,单位毫秒,所有请求的平均响应时间。
  • Min:请求的最小服务器响应时间,单位毫秒。
  • Max:请求的最大服务器响应时间,单位毫秒。
  • Average size (bytes):平均每个请求的大小,单位字节。
  • Current RPS:当前的rps,每秒的请求数。
  • Current Failures/s:每秒钟处理请求失败的数量。

补充:

运行方式:
locust -f 文件名 --headless -u 用户数 -r 运行速率 --run-time 运行时间 --csv=example -H 主机地址
   

部分常用参数解析:
-f 文件名
--headless 无界面
-u 设置模拟的用户总数
-r 每秒启动的虚拟用户数
--run-time 运行时间
--csv=example 生成csv报告
-H 主机地址
--loglevel 日志 --loglevel=DEBUG/INFO/WARNING/ERROR/CRITICAL

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值