使用locust进行压力测试
一、背景
我们有一个项目接口压测,报文数据其中一个字段是视频加密后的字符串,很长很长,如果使用Jmeter,由于报文过长会导致Jmeter卡死,无法使用。
二、locust简介
1、定义
Locust是一款易于使用的分布式负载测试工具,完全基于事件,即一个locust节点也可以在一个进程中支持数千并发用户,不使用回调,通过gevent使用轻量级过程(即在自己的进程内运行)。
2、特点
①、不需要编写笨重的UI或者臃肿的XML代码,基于协程而不是回调,脚本编写简单易读;
②、有一个基于we简洁的HTML+JS的UI用户界面,可以实时显示相关的测试结果;
③、支持分布式测试,用户界面基于网络,因此具有跨平台且易于扩展的特点;
④、所有繁琐的I / O和协同程序都被委托给gevent,替代其他工具的局限性;
3、locust与jmeter的区别
工具 区别
jmeter 需要在UI界面上通过选择组件来“编写”脚本,模拟的负载是线程绑定的,意味着模拟的每个用户,都需要一个单独的线程。单台负载机可模拟的负载数有限
locust 通过编写简单易读的代码完成测试脚本,基于事件,同样配置下,单台负载机可模拟的负载数远超jmeter
PS:但locust的局限性在于,目前其本身对测试过程的监控和测试结果展示,不如jmeter全面和详细,需要进行二次开发才能满足需求越来越复杂的性能测试需要。
简而言之,locust可以通过python脚本规避直接使用大报文的弊端,完成压力测试。
三、使用
1、安装locust库
pip install locust即可
2、导入相关库
from locust import HttpUser, TaskSet, task
3、定义一个类,继承TaskSet用来写需要压测的接口详细信息,例如
on_start函数表示每个并发的用户执行时需要执行的操作,类似于unittest里的set_up函数,核心的发送请求还是post和get函数
4、定义一个类,继承HttpUser用来表示需要执行哪些接口任务和执行的host和port,例如
5、通过locust启动
locust -f locust_test.py --host=http://XXXX-idr-record-video.XXXXX.com" -P = 指定端口
其中 host的值为测试接口的host地址
6、访问http://localhost:8089/就可以进入locust页面,输入并发用户数和每秒生成用户数,点击开始即可开始压力测试
Statistics下可以看到聚合报告
Charts下可以看到RPS和响应时间
Failures下可以看到失败接口的错误类型和次数
Exceptions可以看到异常信息
Download Data可以下载相关数据,其中最后一个是测试报告,内容包含聚合报告和RPS和响应时间的图表