locust测试框架快速搭建

一、介绍

        locust是一款完全基于事件的负载测试框架,做性能测试使用的‘协程’方式,支持数十万并发用户,提供有webui图形界面、无图形界面、分布式等多种运行方式、可以用于测试几乎任何系统或协议。


二、安装
        
        
命令安装:pip install locust 
        安装完成后,检查locus的安装结果,locust -v ;如果可以查看到Locus的版本号,就是安装成功了,


三、报错处理

python 错误:‘Cannot connect to proxy.‘

由于用过vpn设置没有把注册表的代理删掉导致的。因此直接的解决办法是找到注册表里面用户的代理设置,删掉它:运行:regedit→找到\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
鼠标单击 Internet Settings文件夹,在右侧把ProxyEnable的值改为0。重新输入命令;安装成功。

四、核心模块

        locust的六个关键模块:
        1、gevent:在Python中实现协程的第三方库。协程又叫微线程Corouine。使用gevent可以获取极高的并发能力;
        2、flask:Python的一个web开发框架,旨在构建Web应用程序;
        3、requests:支持http/https访问的库;
        4、msgpack-python:一种快速、紧凑的二进制序列化格式,使用与类似json的数据;
        5、six:提供了一些简单的工具封装Python2和Python3 之间的差异;
        6、pyzmq:安装这个第三方库,可以把Locust运行在多个进程或多个机器(分布式)

五、编写脚本

(1)定义一个任务类,类名随便定义;
(2)继承SequentialTaskSet 或 TaskSet类,
(3)当类里面的任务请求有先后顺序时继承SequentialTaskSet类;没有,可以使用继承TaskSet类;

import random
from locust import HttpUser, task, between, SequentialTaskSet, tag
    class MyTaskCase(SequentialTaskSet):
            # 初始化方法,相当于 setup
            def on_start(self):
                pass
    
        # @task python中的装饰器,告诉下面的方法是一个任务,
        # 这个装饰器和下面的方法被复制多次,改动一下,就能写出多个接口
        # 装饰器后面带上(数字)代表在所有任务中,执行比例
        # 要用这个装饰器,需要头部引入 从locust中,引入 task
        @task(7) #带上数字表示执行比例;执行总次数中,这个任务执行7次
        @tag("leave_1")
        def regist_(self):  # 一个方法, 方法名称可以自己改
            url = '/erp/regist'  # 接口请求的URL地址;主机地址不用写,后面执行是填上;
            # 定义请求头为类变量,这样其他任务也可以调用该变量
            self.headers = {"Content-Type": "application/json"}
            self.username = "locust_" + str(random.randint(10000, 100000))
            self.pwd = '1234567890'
            # post请求的 请求体
            data = {"name": self.username, "pwd": self.pwd}
            # 使用self.client发起请求,请求的方法根据接口实际选,
            # catch_response 值为True 允许为失败 , 
            # name 设置任务标签名称   -----可选参数
            with self.client.post(url,
                                  json=data,
                                  headers=self.headers,
                                  catch_response=True) as rsp:
                if rsp.status_code > 400:
                    print(rsp.text)
                    rsp.failure('regist_ 接口失败!')
    
        @task  # 装饰器,说明下面是一个任务
        def login_(self):
            url = '/erp/loginIn'  # 接口请求的URL地址
            data = {"name": self.username, "pwd": self.pwd}
            with self.client.post(url,
                                  json=data,
                                  headers=self.headers,
                                  catch_response=True) as rsp:
                # 提取响应json 中的信息,定义为 类变量
                self.token = rsp.json()['token']
                if rsp.status_code < 400 \
                        and rsp.json()['code'] == "200":
                    rsp.success()
                else:
                    rsp.failure('login_ 接口失败!')
    
        @task  # 装饰器,说明下面是一个任务
        def getuser_(self):
            url = '/erp/user'  # 接口请求的URL地址
            # 引用上一个任务的 类变量值   实现参数关联
            headers = {"Token": self.token}  
           # 使用self.client发起请求,请求的方法 选择 get
            with self.client.get(url, 
                                 headers=headers, 
                                 catch_response=True) as rsp: 
                if rsp.status_code < 400:
                    rsp.success()
                else:
                    rsp.failure('getuser_ 接口失败!')
    
        # 结束方法, 相当于teardown
        def on_stop(self):
            pass
    
    # 定义一个运行类 继承HttpUser类, 所以要从locust中引入 HttpUser类
    class UserRun(HttpUser):
        tasks = [MyTaskCase]
        # 设置运行过程中间隔时间 需要从locust中 引入 between
        wait_time = between(0.1, 3)  

        过程中需要导入相应的模块,通过 file-> settings 





六、运行
        在终端中输入:locust -f 被执行的locust文件.py --host=http://被测服务器域名或ip端口地址,也可以不指定host,如 “locust -f locust_test.py --host=http://localhost:8082”;当命令执行成功,会提示服务端口,如:*:8089。此时,则可通过浏览器访问机器ip:8089,看到任务测试页面;

Number of total users to simulate:要模拟的总用户数
Spawn rate (users spawned/second):生成率(用户生成/秒)
Host (e.g. http://www.example.com):主机(例如 http://www.example.com)

七、常用api
        Httpuser :运行类
        Taskset:任务类
        

八、指标体系
响应时间:response time,从开始到完成某项工作的时间;反映系统处理效率的指标;
吞吐量:throughput,单位时间完成的工作度量,反映系统处理能力指标;
事务处理能力:TPS ,包含业务响应时间,成功率和单位时间处理量;
 

Type 访问类型
Name 任务名(python中定义的方法名)
Requests 请求的总次数
Fails 失败的次数
Median (ms) 中间数耗时
Average (ms) 平均耗时
Min (ms) 最低耗时
Max (ms) 最大耗时
Average size (bytes) 平均耗时
Current RPS 每秒钟处理的访问的次数

也可以通过代码里的 psutil 来查看相关指标。

猜你喜欢

转载自blog.csdn.net/guanrongl/article/details/124707110