一、Locust 简介
Locust又名蝗虫,寓意需要较小的硬件资源,提供大量级的并发访问量,是一个基于事件的负载工具,使用协程的方式,Locust 0.14.6以后的版本必须要使用Python 3.6及以上的版本,Locust 0.* 小于等于0.14.6,Locust 1.* 大于等于1.0,且2个版本类型的用法不兼容,执行命令差异,同一个物理环境不能同时存在Locust 0.和Locust 1.,Locust相关资源的下载地址。
Python官网:https://www.locust.io
Microsoft Visual C++ 14.0:https://www.python.org/downloads/release/python-380/
二、Python国内镜像源
阿里云:https://mirrors.aliyun.com/pypi/simple
清华大学:https://pypi.tuna.tsinghua.edu.cn/simple
中国科技大学:<u>https://pypi.mirrors.ustc.edu.cn/simple</u>
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=mirrors.aliyun.com
(1) Linux环境
修改 ~/.pip/pip.conf (没有就创建一个文件夹及文件。文件夹要加“.”,表示是隐藏文件夹),文件内容如上所示。
(2) Windows环境
直接在 %userprofile% 目录中创建一个 pip目录,再新建文件 pip.ini,文件内容如上所示。
三、Locust 环境
资源简介 | 安装命令 |
---|---|
查询安装的三方库 | pip list |
安装指定版本locust | pip install locustio==0.14.6 这是0.*目前最后一个版本 |
安装locust 1.* | pip install locust |
安装VC++依赖包 | Locust简介中VC++下载地址安装选择使用的C++桌面开发工具 |
执行命令 | 执行locust脚本命令实例 | 命令介绍 |
---|---|---|
-H 或 --host | locust -f locustmode.py --host https://www.python.org:8080 | 指定被测服务器的IP及端口号,执行类中定义了可以不用写。 |
-P 或 --port 或 --web-port | locust -f locustmode.py --port 8000 | 指定locust启动的端口,--port在l.*版本不支持 |
--web-host | locust -f locustmode.py --web-host 192.168.1.100 | 指定locustweb访问ip |
--step-load --step-clients --step-time | locust -f locustmode.py --step-load | 负载测试:对服务器进行阶梯式增加压力测试,仅限0.*版本 |
--step-load --step-users --step-time | locust -f locustmode.py --step-load --step-users 1000 --step-time 10 | 负载测试:对服务器进行阶梯式增加压力测试,仅限1.*版本 |
--no-web -c -t | locust -f locustmode.py --no-web -c 1000 -t 2 | 无UI模式必须配合其他参数使用,1.*版本变成了--headless |
-c 或 -u | locust -f locustmode.py --no-web -c 1000 -t 20s | 无UI模式设置总的并发用户数且locust 1.*版本-c要改成-u |
-t 或 --run-time | locust -f locustmode.py --no-web -c 1000 -t 20s | 无UI模式设置运行的时长等于UI页面的step duration输入框 |
--csv | locust -f locustmode.py --no-web -c 1000 -t 2 --csv=report | 生成报告并保存到本地 |
--master | locust -f locustmode.py ---master | 分布式的主控程序默认端口5557 |
--slave | locust -f locustmode.py --slave --master-host 主控IP --master-port 主控端口 | 分布式的助攻程序,1.*版本变成了--worker |
#!/usr/bin/python3
import os
from locust import HttpLocust,between,seq_task,task
from locust import TaskSequence #locust 1.*没有这个方法。
#性能测试用例管理类,TaskSequence父类的作用是管理执行顺序。
#locust 1.*版本父类就变成了SequentialTaskSet
class TestSuite(TaskSequence):
#初始化方法,相当于__init__函数,在用例之前执行。
def on_start(self):
pass
#最后执行的方法,相当于teardown,在用例之后执行。
def on_stop(self):
pass
#测试用例模版
@task #表示这个方法是一个任务,@task(1)表示执行的次数。
@seq_task(2) #表示执行的顺序,locust 1.*的顺序是按照代码位置排序,不需要这个装饰器。
def case_demo(self):
url = "/downloads/release/python-380"
header = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"}
data = {"user":"muge","pwd":"123456"}
#self.count相当于requests,catch_response表示允许失败,name设置任务标签。
#注意json=data与data=json.dumps(data)是表达的意思相同。
response = self.count.post(url,headers=header,json=data,catch_response=True,name="case_demo")
if response.status_code == 200:
response.success()
else:
response.failure("request interface failure!")
"""
#locust 1.*版本的请求尽量按照以下方式写,不然会存在兼容性问题。
with self.count.post(url,headers=header,json=data,catch_response=True,name="case_demo") as response:
if response.status_code == 200:
response.success()
else:
response.failure("request interface failure!")
"""
#性能测试用例执行类
class RunCase(HttpLocust):
#task_set在locust 1.*版本已被移除换成了tasks且不需要导入,必须使用列表或字典。
task_set = TestSuite #指向测试类,也可以是[TestSuite1,TestSuite2]
wait_time = between(0.1,3) #定义用例执行过程中的随机等等事件单位是秒。
host = "https://www.python.org:8080" #定义被测服务器,也可以在执行命令中用-H ip:port表现。
if __name__ == '__main__':
pass
# os.system("locust -f locustmode.py")