【性能测试】【locust】快速入门
简介
locust是一个开源的分布式用户负载压力测试工具,对网站(其他系统,例如接口等)进行负载测试,并确定可以处理多少的并发用户,locust特点利用了协程支持,达到高数量级别的并发,以及基于事件驱动使用gevent库来实现网络并发请求。https://www.locust.io/
环境配置
- Python 3.8.2
- pycharm
- window or linux
安装locust
pip install locust
依赖库
安装locust后,会自动下载对应的依赖库
-
gevent: gevent是第三方库,通过greenlet实现协程, 当访问网络时,IO操作会消耗很长时间出现等待情况,greenlet会自动切换其他greenlet,直到IO操作完成,再切换回来,保证greenlet始终再运行,而不是再等待
-
requests: requests库,http库,实现各种请求,get,post,put,delete, 这边在locust封装后与requests库对应使用
request | locust |
---|---|
request.post() | client.post() |
request.get() | client.get() |
request.delete() | client.delete() |
request.put() | client.put() |
-
psutil:是一个监控库,监控cpu, 内存,磁盘等
-
flask, Flask-BasicAuth: flask web第三方框架,Flask-BasicAuth:权限验证
-
pyzmq: 可用于Locust分布运行在多个进程/机器上
实现原理
locust有比较重要的概念,一个定义用户行为(继承TaskSet), 一个是用户类(继承HttpUser)
TaskSet
定义一组用户将要执行的tasks场景,实现了虚拟用户所执行任务的调度算法,TaskSet子类重定义任务,采用@task装饰器
例子
- @task(1) 权重为1,@task(2)权重为2, 意思就是test_job2执行的频率是test_job1的两部
from locust import TaskSet, task
class UserBehavior(TaskSet):
@task(1)
def test_job1(self):
self.client.get('/job1')
@task(2)
def test_job2(self):
self.client.get('/job2')
- 第二种权重写法
from locust import TaskSet, task
class UserBehavior(TaskSet):
@task
def test_job1(self):
self.client.get('/job1')
@task
def test_job2(self):
self.client.get('/job2')
class WebUser(HttpUser):
tasks = [test_job1, test_job2] # 不写的话比重就是1:1
# tasks = {test_job1:1, test_job2:2} # 两种方式等价
HttpUser
代替了之前版本的Httplocust实例化时创建一个client属性,该属性是一个具有支持的HTTP客户端用于在请求之间保持用户会话,创建的HttpSession的实例。客户端支持cookies,因此在HTTP请求之间保持会话,由于request.Session, 再登陆系统后维持了登陆的seesion, 后面的task脚本操作都带上了session
简单示例
代码示例
__author__ = 'wangxiao'
import os
# 导入包
from locust import HttpUser, task, between, TaskSet
# 定义task行为类继承TaskSet
class SouMiSearch(TaskSet):
#
@task
def search(self):
url = "/api/p/search/"
body = {"keywords": "ceess"}
with self.client.post(url, json=body) as response:
print(response.text)
class WebUser(HttpUser):
tasks = [SouMiSearch]
wait_time = between(2, 5)
host = "http://api.shoumilive.com:83"
if __name__ == '__main__':
os.system("locust -f test_search.py")
# 运行
[2020-08-19 09:59:48,212] md2bkpyc/WARNING/locust.main: System open file limit setting is not high enough for load testing, and the OS wouldnt allow locust to increase it by itself. See https://docs.locust.io/en/stable/installation.html#increasing-maximum-number-of-open-files-limit for more info.
[2020-08-19 09:59:48,212] md2bkpyc/INFO/locust.main: Starting web interface at http://:8089
[2020-08-19 09:59:48,229] md2bkpyc/INFO/locust.main: Starting Locust 1.1.1
默认端口8089, 浏览器访问127.0.0.1:8089
- Number of total users to simulate: 设置总共的模拟用户总数
- Hatch rate (users spawned/second):每秒启动的虚拟用户数
场景设置
- 设置用户总数10个,每秒启动5个
测试监控界面
Statustics
页面指标 | 解析 | 备注 |
---|---|---|
type | 请求类型 | |
Name | 请求名称 | 这个可以自定义,传name参数即可 |
Requests | 当前已完成的请求数量 | |
Fails | 失败的请求数量 | |
Requests | 当前已完成的请求数量 | |
Median | 响应时间的中间值,即50%的响应时间在这个数值范围内,单位为毫秒 | |
90%ile | 90%的响应时间在正态分布平均值下方,即小于这个值 | |
Min | 最小响应时间,单位为毫秒 | |
Max | 最大响应时间,单位为毫秒 | |
average Size | 平均每个请求的数据量,单位为字节 | |
current RPS | 每秒钟处理请求的数量 |