zoukankan      html  css  js  c++  java
  • Locust 基本使用

    Locust 使用Python代码来定义用户行为,用它可以模拟百万级的并发用户来访问系统。

    与其他性能工具对比如下:

    LoadRunner

    商业性能测试工具,报告完整,不支持二次开发

    开发语言:C/Java

    并发机制:进程/线程

    Jmeter

    开源性能测试工具,简单报告,支持二次开发。

    开发语言:Java

    并发机制:线程,需要在UI界面上通过选择组件来编写脚本,模拟的负载是线程绑定的,

    模拟的每个用户都需要一个单独的线程,单台负载机可模拟的负载数有限。

    Locust

    开源性能测试工具,简单报告,支持二次开发。

    开发语言:python

    并发机制:协程,LoadRunner和Jmeter这类采用进程和线程的测试工具,很难在单机

    上模拟出较高的并发压力。Locust的并发机制摒弃了进程和线程,采用协程(gevent)

    机制。协程避免了系统级资源调度,由此可以大幅提高单机的并发能力。

    locust的安装

    # 1. 命令行安装
    pip3 install locust
    
    # 2. 直接在pycharm中导入
    
    # 3. github下载安装 https://github.com/locustio/locust/ clone后执行setup.py文件
    python setup.py install
    
    # 检查是否安装成功
    locust --help

     

    locust版本信息、python版本以及依赖库如下查询:

    gevent 是在python中实现协程的第三方库,协程又叫微线程Coroutine。

    flask 是python 的一个web开发框架。

    requests 是python中可进行http(s)请求的操作库。

    msgpack 是一种快速、紧凑的二进制序列化格式,适用于类似Json的数据。

    six提供了一些简单的工具用来封装Python2和Python3之间的差异性。

    pyzmq 可用于Locust分布运行在多个进程/机器上。

     

    实现例子及用法注释

    访问博客首页例子

    # coding:utf-8
    from locust import HttpLocust, TaskSet, task
    import urllib3
    
    """
    使用Python3 requests发送HTTPS请求,已经关闭认证(verify=False)情况下,控制台会输出以下错误, 忽略报错的方法如下:
    InsecureRequestWarning: Unverified HTTPS request is being made. 
    Adding certificate verification is strongly advised. 
    See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
    """
    urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
    
    class UserBehavior(TaskSet):
        # UserBehavior类,继承了TaskSet类,用于定义测试任务的
    
        header = {
            "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36"}
    
        # on_start 相当于任务开始的入口,可进行初始化,此处省略了实现
        def on_start(self):
            pass
    
        # @task()装饰的方法为一个事务。方法的参数用于指定该行为的执行权重。参数越大每次被虚拟用户执行的概率越高。如果不设置默认为1
        @task(1)
        def cnblogsHome(self, header):
            request = self.client.get("/", headers=header, verify=False)
    
        @task(2)
        def cnblogsHome(self, header):
            request = self.client.get("/belle-ls/", headers = header, verify = False)
    class websitUser(HttpLocust):
        """
        HttpLocust类继承了HttpSession类,HttpSession使用率requests.Session,所以用client方法请求登录后,会保存登录状态,具有session记忆功能
        """
        task_set = UserBehavior #Task_set属性,它是唯一必须要有的,它指向Task Set类,定义用户的行为
        min_wait = 3000 #请求等待最小时间
        max_wait = 6000 #请求等待最大时间
        # 每个用户执行两个任务间隔时间的上下限(毫秒),具体数值在上下限中随机取值,若不指定则默认间隔时间固定为1秒
        # host:被测系统的host,当在终端中启动locust时没有指定--host参数时才会用到
        # weight: 一个Locust实例被挑选执行的权重,数值越大,执行频率越高
        # stop_timeout: 设置 Locust 多少秒后超时,如果为 None ,则不会超时。
    
    if __name__ == "__main__":
        import os
        os.system("locust -f locustDemo.py --host=https://www.cnblogs.com")

    @task装饰器和tasks属性:以下两种写法是等价的

    from locust import TaskSet, task
    
    class UserBehavior(TaskSet):
        @task
        def job1(self):
            self.client.get('/job1')
    
        @task
        def job2(self):
            self.client.get('/job2')
    ####################################
    from locust import TaskSet
    
    def job1(obj):
        obj.client.get('/job1')
    
    def job2(obj):
        obj.client.get('/job2')
    
    class UserBehavior(TaskSet):
        tasks = [job1, job2]
        # 或者指定执行频率 tasks = {job1:1, job2:1}
     

    执行脚本,locust启动。

     

    web模式:如果Locust运行在本机,在浏览器中访问http://localhost:8089即可进入Locust的Web管理页面;如果Locust运行在其它机器上,那么在浏览器中访问http://locust_machine_ip:8089即可

    web模式执行过程如下:

    按钮:

    Edit:点击该按钮可对模拟的总虚拟用户和每秒启动的虚拟用户数进行重新设定

    STOP:停止运行,缺点----locust只能手动停止,无法自动停止

     

    locust运行命令

    """
    web模式运行
    -f 指定脚本的绝对路径  --host指定被测接口的服务主机
    """
    locust -f load_test.py --host=https://www.baidu.com
    
    
    """
    --no-web模式运行
    -c 设置虚拟用户数
    -r 设置每秒启动虚拟用户数
    -t 设置运行时间
    
    """
    locust -f load_test.py --host=https://www.baidu.com --no-web -c 10 -r 2 -t 1m
    
    
    """
    分布式运行Locust,如果是--no-web模式运行,master会等待slave机器节点接入后运行
    --master 设置locust为master模式,网页交互会在这台节点机器中运行
    --slave 设置locust的slave模式
    --master-host 如果是本机多进程运行,可省略
    """
    locust -f load_test.py --master
    locust -f load_test.py --slave --master-host = 192.168.1.110

    参数说明:

     1 -h, –help:查看帮助
     2 -H HOST, –host=HOST:指定被测试的主机,采用以格式:http://192.168.1.110
     3 –web-host=WEB_HOST:指定运行 Locust Web 页面的主机,默认为空
     4 -P PORT, –port=PORT, –web-port=PORT:指定 –web-host 的端口,默认是8089
     5 -f LOCUSTFILE, –locustfile=LOCUSTFILE:指定运行 Locust 性能测试文件,默认为: locustfile.py
     6 –csv=CSVFILEBASE, –csv-base-name=CSVFILEBASE:以CSV格式存储当前请求测试数据
     7 –master:Locust 分布式模式使用,当前节点为 master 节点
     8 –slave:Locust 分布式模式使用,当前节点为 slave 节点。
     9 –master-host=MASTER_HOST:分布式模式运行,设置 master 节点的主机或 IP 地址,只在与 –slave 节点一起运行时使用,默认为:127.0.0.1
    10 –master-port=MASTER_PORT:分布式模式运行, 设置 master 节点的端口号,只在与 –slave 节点一起运行时使用,默认为:5557。注意,slave 节点也将连接到这个端口+1 上的 master 节点。
    11 –master-bind-host=MASTER_BIND_HOST:master运行模式需要设置host,默认是* 所有有效接口
    12 –master-bind-port=MASTER_BIND_PORT:应该设置master端口号(只用于master执行是),默认5557. 也会使用这个端口+1的端口,所以默认master会被连接到5557和5558两个端口
    13 –expect-slaves=EXPECT_SLAVES:开始测试之前期望多少个slave节点接入 (只–no-web模式).
    14 –no-web:no-web 模式运行测试,需要 -c 和 -r 配合使用.
    15 -c NUM_CLIENTS, –clients=NUM_CLIENTS:指定并发用户数,作用于 –no-web 模式
    16 -r HATCH_RATE, –hatch-rate=HATCH_RATE:指定每秒启动的用户数,作用于 –no-web 模式。
    17 -t RUN_TIME, –run-time=RUN_TIME:设置运行时间, 例如: (300s, 20m, 3h, 1h30m). 作用于 –no-web 模式。
    18 -L LOGLEVEL, –loglevel=LOGLEVEL:选择 log 级别(DEBUG/INFO/WARNING/ERROR/CRITICAL). 默认是 INFO.
    19 –logfile=LOGFILE:日志文件路径。如果没有设置,日志将去 stdout/stderr
    20print-stats:在控制台中打印数据
    21 –only-summary:只打印摘要统计
    22 –no-reset-stats:执行完后不重新设定
    23 -l, –list:显示测试类, 配置 -f 参数使用
    24 –show-task-ratio:打印 locust 测试类的任务执行比例,配合 -f 参数使用.
    25 –show-task-ratio-json:以 json 格式打印 locust 测试类的任务执行比例,配合 -f 参数使用
    26 -V, –version:查看当前 Locust 工具的版本.
  • 相关阅读:
    如何构建积木式Web应用
    ASP.NET 2.0 异步页面原理浅析 [1] [原]
    HybridDictionary 类
    datagrid自定义
    认识.NET的集合
    织梦 10060
    java.io.FileNotFoundException: E:\temp (拒绝访问。)
    引用与对象实例化
    C#中为DataGrid添加下拉列表框
    C#中使用指针
  • 原文地址:https://www.cnblogs.com/belle-ls/p/10405829.html
Copyright © 2011-2022 走看看