使用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,例如
class WebsiteUser(HttpUser):host = "http://127.0.0.1:8089"tasks = [KHS]

5、通过locust启动

locust -f locust_test.py --host=http://XXXX-idr-record-video.XXXXX.com" -P = 指定端口
其中 host的值为测试接口的host地址

6、访问http://localhost:8089/就可以进入locust页面,输入并发用户数和每秒生成用户数,点击开始即可开始压力测试

Statistics下可以看到聚合报告

SituTech > locust进行压力测试 > image2021-1-11_16-18-43.png

Charts下可以看到RPS和响应时间

SituTech > locust进行压力测试 > image2021-1-11_16-19-25.png

Failures下可以看到失败接口的错误类型和次数

SituTech > locust进行压力测试 > image2021-1-11_16-19-55.png

Exceptions可以看到异常信息

SituTech > locust进行压力测试 > image2021-1-11_16-20-37.png

Download Data可以下载相关数据,其中最后一个是测试报告,内容包含聚合报告和RPS和响应时间的图表

SituTech > locust进行压力测试 > image2021-1-11_16-21-37.png

SituTech > locust进行压力测试 > image2021-1-11_16-22-30.png