一、 Locust(蝗虫)介绍
1. 简介
Locust是易于使用的分布式性能(压力/负载)测试框架, 实际用 locust 做压测就是在写 Python 程序,通过测试能够确定系统可以处理多少个并发用户,并且整个测试过程可以在Web的UI界面实时观察测试数据
2. 特点
性能能测试工具核心部分是压力生成器,而压力生成器的核心要点有两个,一是真实模拟用户操作(场景描述),二是模拟并发,在这两个方面,Locust表现都很好
首先在模拟用户操作(也就是测试场景方面),Locust采用 Python脚本描述,并且HTTP请求完全基于Requests库
其次在模拟并发方面,Locust摒弃了进程和线程,采用协程(gevent)机制
通常采用多线程来模拟多用户时,线程数会随着并发数的增加而增加,而线程之间的切换是需要占用资源的,IO的阻塞和线程的sleep会不可避免的导致并发效率下降;正因如此,LoadRunner和Jmeter这类采用进程和线程的测试工具,都很难在单机上模拟出较高的并发压力
协程和线程的区别在于,协程避免了系统级资源调度,由此大幅提高了性能。正常情况下,单台机器可以生产数万甚至更高的并发压力,这是LoadRunner和Jmeter都无法实现的
Locust支持分布在多台计算机上的运行负载测试,可以模拟数十万乃至上百万的并发
Locust具有简洁的用户界面,可实时显示相关的测试详细信息。由于UI是基于Web的,因此它是跨平台的并且易于扩展
二、 Locust环境准备
1.python
目前Python 3.6、3.7和3.8支持Locust
执行指令查看python安装的版本

2.PyCharm安装locust
按照步骤在PyCharm中找到settings,在项目中进行安装locust即可,如图下



3.或者使用pip指令进行安装
指令:pip install locust
如果需要升级locust版本,可以直接在pycharm中直接搜索安装或者使用pip install --upgrade locust指令升级
4.进行验证环境
到Terminal控制台输入 locust -V
如果环境正常,显示版本如下:

三、 使用
locust脚本,编写我们可以按照既定格式进行编写,我把步骤进行了细化如下:
1.定义任务类 继承TaskSet
2.定义用户类 继承HttpUser
3.使用指令 启动locust服务
4.打开web页面 输入相关参数 开始性能测试
具体示例如下:

以上就是locust基本的脚本编写格式,在以上代码中,我们按照既定步骤进行脚本编写,无复杂步骤和混乱代码,按照格式编写。
首先我们定义了一个MyTask类,继承TaskSet,随后编写了需要测试的函数,添加上了注解,注解的添加是很重要的,如果不加上注解,那么它与普通函数无异
随后我们定义了Vuser类,继承HttpUser,他下面有个tasks,需要将我们上面定义的任务类放置到这里,而后我们需要设置等待时间,我们设置等待时间时,因为本次演示脚本只用了一个接口,所以在这里感觉不是特别明显,但是我们在编写实际脚本运行时,可能会有很多的task,所以等待时间是必要加上的,上面介绍一种,我在下面会多写两种其他格式供大家参考,据实际情况使用

脚本编写完成以后,就可以到Terminal控制台输入指令进行运行:
指令:locust -f 脚本文件.py

运行之后会给我们一个网址,复制到浏览器进行打开

打开之后我们会进入这个页面:

随后我们将参数内容填上点击运行,这里需要说一下每秒启动用户数,在这里其实是一个理论值,具体要以机器性能决定,加入你的机器一秒钟最多只能启动5000并发,你在这里填写上一万,其实意义不大。

这里的页面就是我们实际运行的页面,页面也是比较简洁明了的,如果运行达到自己想要的状态了,可以点击右上角的stop进行停止。
四、 运行结果分析
当我们想要结束运行时,可以点击右上角的stop进行结束,随后页面上各数值将停止,我们一一解释页面内容代表什么:

RPS即TPS
是不是感觉到这个页面很熟悉, 这个页面和jmeter的聚合报告很相似,但也有不同点,jmeter想要查看更细致的报告,想要进行加装插件,locust这里则是自动生成了一些详细的报告。
每秒请求数量:

响应时间:

并发用户数量:

查看失败情况:

异常信息:

最后可以下载CSV结果信息:

最后我们返回控制台,控制台中也是可以查看结果信息,较页面显示不是特别直观,如图:

最后,在停止测试我们一定要在控制台Terminal中Ctrl+c停止