性能测试-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 的测试文件。

浙公网安备 33010602011771号