zoukankan      html  css  js  c++  java
  • python压测工具Locust

    python压测工具Locust

    Locust介绍

    Locust作为基于Python语言的性能测试框架。

    其优点在于他的并发量可以实现单机10倍于LoadRunner和Jmeter工具。他的工作原理为协程并发,也就是gevent库。

    Locust的缺点也显而易见,他没有友好的性能监控页面,没有任何关联,参数化,检查点之类的定义。当然基于python这些都不是问题,如果简单的使用,用来做压测是最合适不过了

    Locust安装

    1、安装了python,并加入了环境变量:pip intsall locustio

    2、Pycharm内部直接import Locust,如图:

    Locust实例_1(访问百度首页)

    代码:

     1 from locust import HttpLocust, TaskSet, task  #导入需要引用的类
     2  3 class MyTasks(TaskSet):
     4     '''
     5     创建测试任务,需要继承TaskSet
     6     可以添加多个测试任务
     7     '''
     8     #每个测试任务,往往会以实例方法的形式呈现
     9     #同时需要使用task装饰器来装饰任务
    10     @task
    11     def one_task(self):
    12         print("执行第一个测试任务")
    13         self.client.get("/")  #client封装的requests,所以requests的请求方法都能调用,括号内为子路径,与class RunTasks(HttpLocust)中的host拼接,也可以直接写成self.clint.get("http://www.baidu.com/"),在class RunTasks(HttpLocust)就不需要指host了
    14 15 class RunTasks(HttpLocust):
    16     '''
    17     创建运行测试类,需要继承HttpLocust父类
    18     '''
    19     task_set = MyTasks #指定测试任务类,使用task_set覆盖父类属性
    20     min_wait = 2000    #模拟负载的任务之间执行时的最小等待时间,单位为毫秒
    21     max_wait = 5000    #模拟负载的任务之间执行时的最大等待时间,单位为毫秒
    22     host = "http://www.baidu.com/"   #进行压测的地

    启动:

    可以在cmd中启动,也可以直接在Pycharm的控制台中启动:locust -f locusttest2.py --web-host=127.0.0.1

    -f 后面跟的是需要启动的.py文件,--web-host=127.0.0.1 是我们需要的前端页面展示的地方

    启动之后可以在在浏览器中输入127.0.0.1:8089访问页面

    开始执行:

    统计页面

    图图表页面:

    第一个为:RPS分别为每秒完成的请求数

    第二个为:响应时间

    第三个为:不同时间的虚拟数

    失败请求页面

    异常请求展示页面

    数据下载页面

    Locust实例2(某子系统系统压测)

    from locust import HttpLocust, TaskSet, task
    ​
    class AdminLoadTest(TaskSet):
        '''
        创建后台管理站点压测类,需要继承TaskSet
        可以添加多个任务
        '''
        def login(self):   #登录方法
            '''
            登录实例方法
            :return:
            '''
            self.client.post("http://ip:port/ssoserver/login?service=http://ip:port/portal/cas", {'username': 'Y2R6Znc=','password':'MTIzNDU2NzhBYQ==', 'scope': '','lt':'_cFC77B10F-B8C6-39DF-8177-35D753A043FC_kF557C6AB-47D5-9530-3B1F-75EA4B339131', 'eventId': 'submit'})#这里先截包,找到登录接口,由于密码都进行的js加密处理,所已我们直接正确的用户名密码加密的结果传入。post的参数可以直接使用字典的形式传入
    def logout(self):  #退出登录方法
            '''
            退出实例方法
            :return:
            '''
            self.client.get("http://ip:port/portal/logout") #子系统的退出接口
    def on_start(self):
            '''
            当任何一个task调度执行前,on_start实例方法会被调用
            先登录
            :return:
            '''
            self.login()
    ​
        def on_stop(self):
            '''
            当任何一个task调度执行之后,on_stop实例方法会被调用
            :return:
            '''
            self.logout()
    ​
        @task   #task装饰器来装饰任务
        def admin_index(self):
            '''
            对后台主页进行压测
            :return:
            '''
            self.client.get("http://ip:port/portal/")
    ​
    ​
    class RunLoadTests(HttpLocust):
        '''
        创建运行类
        '''
        task_set = AdminLoadTest
        min_wait = 200    #模拟负载的任务之间执行时的最小等待时间,单位为毫秒
        max_wait = 500    #模拟负载的任务之间执行时的最大等待时间,单位为毫秒
        
    #启动:locust -f test_load.py --web-host=127.0.0.1 --host=172.25.16.7
     

    安装这样的参数,我们执行的动作为:一共1000个用户,每个用户在2~5秒内进行登录,访问首页,退出3个动作。用户数已没5秒一个的方式递增,我们来看看结果:

    总览页面

    图表页面:

    针对这3个动作,子系统每秒能完成的请求数在150左右

    响应时间随着用户量增加,持续上升

    没有失败和异常的请求

    总结:

    locust用来做压测工具还是挺不错了,因为它单机能模拟并发量确实是太高了(采用的是协程的方式模拟并发),初次之外,locust还支持分布式,这样并发量就进一步提升了。由于Locust的缺点也显而易见,他没有友好的性能监控页面,没有任何关联,参数化,检查点之类的定义,所以locust单独不适合做完整的性能测试,当然如果能结合python的其他的库,也应该可以解决。有兴趣的小伙伴可以研究研究...

  • 相关阅读:
    install jqdatasdk
    分布式唯一ID自增(雪花算法)
    JVM内存布局及GC知识
    double涉及大数据的时候会变成科学计数法
    IDEA中的JUNIT测试
    spring boot 整合 swagger2
    springboot 报错nested exception is java.lang.IllegalStateException: Failed to check the status of the service xxxService No provider available for the service
    解决jar包依赖冲突(idea)
    IDEA中springboot的热部署
    Exception in thread "main" java.lang.AbstractMethodError: org.springframework.boot.context.config.ConfigFileApplicationListener.supportsSourceType(Ljava/lang/Class;)Z
  • 原文地址:https://www.cnblogs.com/fccyccf/p/11586305.html
Copyright © 2011-2022 走看看