性能测试-python+locust

1、locust安装

locust环境:操作系统无要求,可以跨平台,python版本3.6+ 

安装方法:

    • 安装方式:
      • 旧版本安装命令为:pip install locustio
      • 新版本安装命令为:pip install locust
      • 指定版本:pip install locustio==0.12.2
    • 参数变化
      • 吴图形模式启动参数: 旧版本为--no-web 新版本为--headless
        -代码中类的变化

安装后检查:

  locust -v

locust是基于事件,用协程进行性能测试

2、locust脚本-万能模板

import random
from locust import HttpUser, task, between, SequentialTaskSet, tag


# 定义一个任务类,这个类名称自己随便定义,
# 类继承SequentialTaskSet 或 TaskSet类,所以要从locust中,引入SequentialTaskSet或TaskSet
# 当类里面的任务请求有先后顺序时,
# 继承SequentialTaskSet类, 没有先后顺序,可以使用继承TaskSet类

class MyTaskCase(SequentialTaskSet):
    # 初始化方法,相当于 setup
    def on_start(self):
        pass

    # @task python中的装饰器,告诉下面的方法是一个任务,
    # 这个装饰器和下面的方法被复制多次,改动一下,就能写出多个接口
    # 装饰器后面带上(数字)代表在所有任务中,执行比例
    # 要用这个装饰器,需要头部引入 从locust中,引入 task
    @task
    @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)  


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

来自链接:http://testingpai.com/article/1595507306840

3、运行locust脚本以及脚本模板-https://docs.locust.io/en/stable/configuration.html

终端运行脚本:

locust -f .\locust2.py
PS D:\soft\pythoncodecfl\Locust> locust -f .\locust2.py
[2022-08-21 20:35:29,139] DESKTOP-1NL6VHT/INFO/locust.main: Starting web interface at http://0.0.0.0:8089 (accepting connections from all network interfaces)
[2022-08-21 20:35:29,254] DESKTOP-1NL6VHT/INFO/locust.main: Starting Locust 2.11.0

登录http://0.0.0.0:8089界面,即本机ip+端口,或者直接http://localhost:8089/

 

 

 运行后显示界面介绍

 

 

 

  • Type:请求类型,即接口的请求方法;
  • Name:请求名称;
  • requests:当前已完成的请求数量;
  • fails:当前失败的数量;
  • Median:响应时间的中间值,即50%的响应时间在这个数值范围内,单位为毫秒;
  • 90%ile:90%的接口响应时间小于这个值的;
  • Average:平均响应时间,单位为毫秒;
  • Min:最小响应时间,单位为毫秒;
  • Max:最大响应时间,单位为毫秒;
  • average Size:平均每个请求的数据量,单位为字节;
  • current RPS(requests per second):每秒钟处理请求的数量,即RPS。

4、locust图形、无图型界面模式-各参数说明https://blog.csdn.net/Moleefouch/article/details/125065330

运行locust:locust -f my_locust.py

locust -f 执行文件.py --headless -u 30 -r 20 -t 2m --host=http://被测系统 --csv=结果报告文件前缀

-u 1000 用户数1000
-r 100  每秒孵化/新增100个用户
-t 1m运行1分钟
-t 1h    运行1小时
-t 8h6m      运行8小时6分

tags-打标签
只执行tag1的任务:locust -f my_locust.py --tags tag1
不执行tags的任务,其他都执行:locust -f my_locust.py --exclude-tags tag3

5、分布式

同一机器
启动主进程 locust -f 执行文件.py --master
启动助攻进程 locust -f 执行文件.py --slave

不同机器
启动主进程 locust -f 执行文件.py --master
启动助攻进程 locust -f 执行文件.py --slave --master-host=主控机器ip --master-port=5557

 

再次强调:

1、master 节点的机器自身不会模拟任何用户。

2、master 和 worker 之间必须是同一个局域网。

3、master 和 worker 安装的 locust 版本要一致。

4、同时需要包含一样的locust 的测试文件。

 
posted @ 2022-08-23 21:38  依羽杉  阅读(722)  评论(0)    收藏  举报