zoukankan      html  css  js  c++  java
  • Locust介绍

    Locust介绍

      官网:https://docs.locust.io/en/latest/api.html

      Locust是使用Python语言编写实现的开源性能测试工具,简洁、轻量、高效,并发机制基于gevent协程,可以实现单机模拟生成较高的并发压力。

    主要特点如下:

      1) Locust测试框架中,使用普通的Python脚本用户测试场景

      2) 分布式和可扩展,支持成千上万的用户

      3) 基于Web的用户界面,用户可以实时监控脚本运行状态

      4) 几乎可以测试任何系统,除了web http接口外,还可自定义clients测试其他类型系统

      对于最常见的HTTP(S)协议的系统,Locust采用Python的requests库作为客户端,使得脚本编写大大简化,富有表现力的同时且极具美感。而对于其它协议类型的系统,Locust也提供了接口,只要我们能采用Python编写对应的请求客户端,就能方便地采用Locust实现压力测试。从这个角度来说,Locust可以用于压测任意类型的系统。

      在模拟有效并发方面,Locust的优势在于其摒弃了进程和线程,完全基于事件驱动,使用gevent提供的非阻塞IO和coroutine来实现网络层的并发请求,因此即使是单台压力机也能产生数千并发请求数;再加上对分布式运行的支持,理论上来说,Locust能在使用较少压力机的前提下支持极高并发数的测试。

    示例:

    #coding:utf-8
    
    from locust import HttpLocust, TaskSet, task
    
    class UserBehavior(TaskSet):
    
        def on_start(self):
    
            """ on_start is called when a Locust start before any task is scheduled """
    
            self.login()
    
        def login(self):
    
            self.client.post("/login", {"username":"ellen_key", "password":"education"})
    
        @task(2)
    
        def index(self):
    
            self.client.get("/")
    
        @task(1)
    
        def profile(self):
    
            self.client.get("/profile") 
    
    class WebsiteUser(HttpLocust):
    
        task_set = UserBehavior
    
        host='http://example.com'
    
        min_wait = 5000
    
        max_wait = 9000

      上面是官方的示例demo,定义了针对http://example.com网站的测试场景:先模拟用户登录系统,然后随机地访问index(/)和profile页面(/profile/),请求比例为2:1;并且,在测试过程中,两次请求的间隔时间为5~9秒间的随机值。

    运行:

      windows cmd下启动locust :locust -f test.py --host=https://www.baidu.com

     

    Locust类:

      Locust类的client属性对应虚拟用户作为客户端的请求方法。在使用Locust时,需要先继承Locust类,然后在继承子类中的client属性中绑定客户端的实现类。

      对于常见的HTTP(S)协议,Locust已经实现了HttpLocust类,其client属性绑定了HttpSession类,而HttpSession又继承自requests.Session。因此在测试HTTP(S)的Locust脚本中,我们可以通过client属性来使用Python requests库的所有方法,包括GET/POST/HEAD/PUT/DELETE/PATCH等,调用方式也与requests完全一致。另外,由于requests.Session的使用,因此client的方法调用之间就自动具有了状态记忆的功能。常见的场景就是,在登录系统后可以维持登录状态的Session,从而后续HTTP请求操作都能带上登录状态。而对于HTTP(S)以外的协议,我们同样可以使用Locust进行测试,只是需要我们自行实现客户端。在客户端的具体实现上,可通过注册事件的方式,在请求成功时触发events.request_success,在请求失败时触发events.request_failure即可。然后创建一个继承自Locust类的类,对其设置一个client属性并与我们实现的客户端进行绑定。主要,我们就可以像使用HttpLocust类一样,测试其它协议类型的系统了。

      在Locust类中,除了client属性,还有几个属性需要关注下:

    task_set: 指向一个TaskSet类,TaskSet类定义了用户的任务信息,该属性为必填;

    max_wait/min_wait: 每个用户执行两个任务间隔时间的上下限(毫秒),具体数值在上下限中随机取值,若不指定则默认间隔时间固定为1秒;

    host:被测系统的host,当在终端中启动locust时没有指定--host参数时才会用到;

    weight:同时运行多个Locust类时会用到,用于控制不同类型任务的执行权重。

    测试开始后,每个虚拟用户(Locust实例)的运行逻辑都会遵循如下规律:

    先执行WebsiteTasks中的on_start(只执行一次),作为初始化;

    从WebsiteTasks中随机挑选(如果定义了任务间的权重关系,那么就是按照权重关系随机挑选)一个任务执行;

    根据Locust类中min_wait和max_wait定义的间隔时间范围(如果TaskSet类中也定义了min_wait或者max_wait,以TaskSet中的优先),在时间范围中随机取一个值,休眠等待;

    重复2~3步骤,直至测试任务终止。

    Taskset类:

      TaskSet类实现了虚拟用户所执行任务的调度算法,包括规划任务执行顺序(schedule_task)、挑选下一个任务(execute_next_task)、执行任务(execute_task)、休眠等待(wait)、中断控制(interrupt)等等。在此基础上,我们就可以在TaskSet子类中采用非常简洁的方式来描述虚拟用户的业务测试场景,对虚拟用户的所有行为(任务)进行组织和描述,并可以对不同任务的权重进行配置。

      在TaskSet子类中定义任务信息时,可以采取两种方式,@task装饰器和tasks属性。

    采用@task装饰器定义任务信息时,描述形式如下:

    from locust import TaskSet, task
    
    class UserBehavior(TaskSet):
    
        @task(1)
    
        def test_job1(self):
    
            self.client.get('/job1')
    
        @task(2)
    
        def test_job2(self):
    
            self.client.get('/job2')

    采用tasks属性定义任务信息时,描述形式如下:

    from locust import TaskSet
    
    def test_job1(obj):
    
        obj.client.get('/job1')
    
    def test_job2(obj):
    
        obj.client.get('/job2')
    
    class UserBehavior(TaskSet):
    
        tasks = {test_job1:1, test_job2:2}
    
        # tasks = [(test_job1,1), (test_job1,2)]

    # 两种方式等价

    在如上两种定义任务信息的方式中,均设置了权重属性,即执行test_job2的频率是test_job1的两倍。

      在TaskSet子类中除了定义任务信息,还有一个是经常用到的是on_start函数。这个和LoadRunner中的vuser_init功能相同,在正式执行测试前执行一次,主要用于完成一些初始化的工作。例如,当测试某个搜索功能,而该搜索功能又要求必须为登录态的时候,就可以先在on_start中进行登录操作;前面也提到,HttpLocust使用到了requests.Session,因此后续所有任务执行过程中就都具有登录状态了。

    原文参考:http://lovesoo.org/locust-performance-testing-framework-from-entry-to-mastery.html

  • 相关阅读:
    apue学习笔记(第十二章 线程控制)
    apue学习笔记(第十一章 线程)
    apue学习笔记(第十章 信号)
    apue学习笔记(第九章 进程关系)
    apue学习笔记(第八章 进程控制)
    apue学习笔记(第七章 进程环境)
    apue学习笔记(第六章 系统数据文件和信息)
    apue学习笔记(第五章 标准I/O)
    apue学习笔记(第四章 文件和目录)
    apue学习笔记(第三章 文件I/O)
  • 原文地址:https://www.cnblogs.com/xiatian09/p/9761927.html
Copyright © 2011-2022 走看看