之前一直在用 jmeter 进行性能测试,最近在进行 python 接口自动化测试的时候,思考有没有结合 python 的性能测试工具呢?通过各种渠道,开始了 locust 的初探,以下见解,仅供参考~~
- 1.简介
- 1. 什么是 Locust?
- Locust 是易于使用的分布式用户负载测试工具。它旨在对网站系统(或其他系统)进行负载测试并且确定该系统可以承载多少个并发用户。
- 2.Locust 特点有哪些?
- 1.用普通的 python 编写用户测试脚本
- 不需要笨拙的 ui 或臃肿的 xml——只需像通常那样编写代码即可。基于协程而不是回调,代码的外观和行为与正常的、阻塞 Python 代码的代码一样。
- 2.分布式和可扩展
- Locust 支持在多台机器上运行负载测试。由于基于事件,即使一个 Locust 节点也可以在一个进程中处理数千个用户。这背后的部分原因是,即使您模拟了那么多用户,也不是所有用户都主动地攻击您的系统。通常,用户都在无所事事地思考下一步该做什么。每秒请求数!=在线用户数量。
- 3.基于 web 的 UI 页面
- Locust 具有简洁的 HTML + JS 用户界面,可实时显示相关的测试详细信息。而且由于 UI 是基于 Web 的,因此它是跨平台的并且易于扩展
- 4.可以测试任何系统
- 尽管 Locust 是面向 Web 的,它也可以用于测试几乎所有系统。只需编写一个您想要测试的客户端,然后用 locust 来包围它!超级容易!
- 5.可控性
- locust 是非常小的且可控制的,我们旨在让它保持这种状态。所有重大的事件 I/O 和协程都委托给 gevent。我们创建 Locust 的原因是替代测试工具的脆弱性
-
2.安装(Tips:目前 locust 支持 python 版本:Python 3.6、3.7 和 3.8)
-
1.windows 下安装
-
2.mac 下安装
- 3.安装成功验证
-
4.注意事项
- 1.在 Windows 上运行 Locust 应该可以很好地开发和测试负载测试脚本。但是,在运行大规模测试时,建议您在 Linux 计算机上执行此操作,因为 gevent 在 Windows 下的性能很差。
- 2.机器上的每个 HTTP 连接都会打开一个新文件(技术上是文件描述符)。操作系统可能会为可以打开的最大文件数设置一个下限。如果该限制小于测试中模拟用户的数量,则会发生故障。将操作系统的默认最大文件数限制增加到大于您要运行的模拟用户数的数量。如何执行此操作取决于所使用的操作系统
- 3.测试 demo
from locust import Locust, TaskSet, task, between
from time import time
class MyTaskSet(TaskSet):
# TaskSet相当于下面所有task的大脑
@task(1) # 声明任务
def my_task(self):
print("执行task" + str(int(time())))
@task(2)
def my_task_2(self):
print("执行task2" + str(int(time())))
class WebUser(Locust):
task_set = MyTaskSet
weight = 5
wait_time = between(5, 15)
host = "" # 域名host
- 1.demo 中我们用 MyTaskSet 来定义用户的操作行为类。一个操作行为类中可以包含多个行为函数(每个行为函数可以进行接口请求,断言等),使用@task来定义每个函数执行的权重(按照 demo 中配置的,my_task:my_task_2=1:2,可以有两种理解,一种理解是:执行任务 1 和任务 2 的比例是 1:2;第二种理解:根据概率来说,进入该行为类,用户有三分之二的概率来选择执行第二个任务,本人更倾向于用第二种理解来解释这样的权重配置)
- 2.demo 中使用 WebUser 类来定义用户集(继承 Locust 类,后续根据请求接口的客户端来使用对应的子类,比如 http 请求的 HttpLocust)。一个用户集中可以包含(用户行为类task_set,权重值weight,访问域名host,等待时间wait_time(请使用 between),参数化的用户队列后续会提及),当然权重的概念还是建议大家用概率的概念来进行理解。
- 3.执行编写的脚本,比如对应的.py 文件在项目的路径:xx/xx.py,通过简单的执行命令:locust -f xx/xx.py 来执行,打开 localhost:8089,来配置用户数和每秒启动用户数 (由于该用例中没有请求接口的,所以结果 ui 页面没有展示,可通过最后一张图在 pycharm 中看执行的结果)