Locust接口性能测试
谈到性能测试工具,我们首先想到的是LoadRunner或JMeter。LoadRunner是非常有名的商业性能测试工具,功能非常强大。但现在一般不推荐使用该工具来进行性能测试,主要是使用也较为复杂,而且该工具体积比较大,需要付费且价格不便宜。
JMeter同样是非常有名的开源性能测试工具,功能也很完善,我们之前介绍了它作为接口测试工具的使用。
Locust同样是性能测试工具,虽然官方这样来描述它:“An open source load testing tool.”,但它和前面两个工具有一些不同。
Locust简介
Locust完全基于Python编程语言,采用纯 Python描述测试脚本,并且HTTP请求完全基于Requests库。除了HTTP/HTTPS协议外,Locust还可以测试其他协议的系统,只需采用Python调用对应的库进行请求描述即可。
LoadRunner和JMeter这类采用进程和线程的测试工具,都很难在单机上模拟出较高的并发压力。Locust的并发机制摒弃了进程和线程,采用协程(gevent)的机制。协程避免了系统级资源调度,因此可以大幅提高单机的并发能力。
下载安装
官网地址:https://www.locust.io
使用pip命令安装Locust:
pip install locustio
安装完成之后检测是否安装成功:
C:\Users\Shuqing>locust -help
Usage: locust [options] [LocustClass [LocustClass2 ... ]]Options:-h, --help show this help message and exit-H HOST, --host=HOST Host to load test in the following format:http://10.21.32.33--web-host=WEB_HOST Host to bind the web interface to. Defaults to '' (allinterfaces)-P PORT, --port=PORT, --web-port=PORTPort on which to run web host-f LOCUSTFILE, --locustfile=LOCUSTFILEPython module file to import, e.g. '../other.py'.Default: locustfile....
测试案例
测试场景
针对如下两个接口进行性能测试:
http://127.0.0.1:8000/users/
http://127.0.0.1:8000/groups/
以上两个接口也就是我们之前项目django_restful的接口
负载场景
- 每秒生成2个用户,总共生成60个用户。
- 负载测试5分钟然后查看接口的平均响应时间。
脚本实现
restful_api_locust.py
from locust import HttpLocust,TaskSet,taskclass UserBehavior(TaskSet):@task(2)def test_users(self):self.client.get("/users/",auth=('51zxw','zxw20182018'))@task(1)def test_groups(self):self.client.get("/groups/",auth=('51zxw','zxw20182018'))class WebsiteUser(HttpLocust):task_set = UserBehaviormin_wait = 3000max_wait = 6000
UserBehavior类继承TaskSet类,用于描述用户行为。
@task装饰该方法为一个事务,后面的数字表示请求比例,上面的比例为2:1默认都是1:1test_users()方法表示一个用户行为,这里是请求user接口。test_groups()方法表示请求group接口。client.get()用于指定请求的路径。
WebsiteUser类用于设置性能测试。
task_set:指向一个定义的用户行为类。min_wait:执行事务之间用户等待时间的下界(单位:毫秒)。max_wait:执行事务之间用户等待时间的上界(单位:毫秒)。
执行测试
使用如下命令开始启动测试
C:\Users\Shuqing>locust -f D:\api_test\locust\restful_api_locust.py --host=http://127.0.0.1:8000
[2018-07-24 15:39:22,917] LAPTOP-8B5JADC8/INFO/locust.main: Starting web monitor at *:8089
[2018-07-24 15:39:22,917] LAPTOP-8B5JADC8/INFO/locust.main: Starting Locust 0.8.1
在浏览器打开localhost:8089可以看到如下页面:

- Number of users to simulate:设置模拟用户数。
- Hatch rate(users spawned/second):每秒产生(启动)的虚拟用户数。
- 单击“Start swarming”按钮,开始运行性能测试
运行之后可以看到主界面如下:

性能测试参数如下。
- Type:请求的类型,例如GET/POST。
- Name:请求的路径。
- request:当前请求的数量。
- fails:当前请求失败的数量。
- Median:中间值,单位毫秒,一半的服务器响应时间低于该值,而另一半高于该值。
- Average:平均值,单位毫秒,所有请求的平均响应时间。
- Min:请求的最小服务器响应时间,单位毫秒。
- Max:请求的最大服务器响应时间,单位毫秒。
- Content Size:单个请求的大小,单位字节。
- reqs/sec:每秒钟请求的个数。
点击 Charts 菜单可以查看性能图表

图表含义如下:
- Total Request per Second :每秒的请求数
- Average Response Time: 平均响应时间
- Number of Users: 用户数
参数化
测试场景
如果想对如下接口进行并发测试,则可以将id进行参数化设置
http://127.0.0.1:8000/groups/1/
http://127.0.0.1:8000/groups/2/
http://127.0.0.1:8000/users/1/
http://127.0.0.1:8000/users/2/
代码实现
locust_users_groups.py
from locust import HttpLocust,TaskSet,taskclass UserBehavior(TaskSet):def on_start(self):#设置user和group参数下标初始值self.users_index=0self.groups_index=0@taskdef test_users(self):#读取参数users_id=self.locust.id[self.users_index]url="/users/"+str(users_id)+'/'self.client.get(url,auth=('51zxw','zxw20182018'))#取余运算循环遍历参数self.users_index=(self.users_index+1)%len(self.locust.id)@taskdef test_groups(self):#参数化groups_id=self.locust.id[self.groups_index]url="/groups/"+str(groups_id)+"/"self.client.get(url,auth=('51zxw','zxw20182018'))self.groups_index=(self.groups_index+1)%len(self.locust.id)class WebsiteUser(HttpLocust):task_set = UserBehavior#参数配置id=[1,2]min_wait = 3000max_wait = 6000#host配置host = 'http://127.0.0.1:8000'
运行结果
执行如下命令即可运行测试
C:\Users\Shuqing>locust -f D:\api_test\locust\locust_users_groups.py

运行模式
no-web运行
前面是通过登录web来运行测试的,其实也可以非web状态来运行,如cmd命令来运行。如果需要非Web形式运行,则需使用--no-web参数,并会用到如下几个参数。
-c, --clients:指定并发用户数;-r, --hatch-rate:指定并发加压速率,默认值位1。-t, --run-time:设置运行时间。如(300s,20m, 3h, 1h30m等);
运行命令如下:
locust -f D:\api_test\locust\locust_users_groups.py --no-web -c 10 -r 2 -t 15s
运行结果如下:
C:\Users\Shuqing>locust -f D:\api_test\locust\locust_users_groups.py --no-web -c 10 -r 2 -t 15s
[2018-08-21 10:12:59,017] LAPTOP-8B5JADC8/INFO/locust.main: Run time limit set to 15 seconds
[2018-08-21 10:12:59,017] LAPTOP-8B5JADC8/INFO/locust.main: Starting Locust 0.8
[2018-08-21 10:12:59,018] LAPTOP-8B5JADC8/INFO/locust.runners: Hatching and swarming 10 clients at the rate 2 clients/s...Name # reqs # fails Avg Min Max | Median req/s
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------Total 0 0(0.00%) 0.00Name # reqs # fails Avg Min Max | Median req/s
--------------------------------------------------------------------------------------------------------------------------------------------GET /groups/1/ 2 0(0.00%) 134 122 146 | 120 0.00GET /users/1/ 2 0(0.00%) 118 100 136 | 100 0.00
--------------------------------------------------------------------------------------------------------------------------------------------Total 4 0(0.00%) 0.00Name # reqs # fails Avg Min Max | Median req/s
--------------------------------------------------------------------------------------------------------------------------------------------GET /groups/1/ 4 0(0.00%) 135 122 146 | 130 1.00GET /users/1/ 4 0(0.00%) 115 100 136 | 100 1.00
--------------------------------------------------------------------------------------------------------------------------------------------Total 8 0(0.00%) 2.00[2018-08-21 10:13:04,034] LAPTOP-8B5JADC8/INFO/locust.runners: All locusts hatched: WebsiteUser: 10
[2018-08-21 10:13:04,034] LAPTOP-8B5JADC8/INFO/locust.runners: Resetting statsName # reqs # fails Avg Min Max | Median req/s
--------------------------------------------------------------------------------------------------------------------------------------------GET /groups/1/ 1 0(0.00%) 147 147 147 | 150 0.00GET /users/1/ 2 0(0.00%) 110 92 128 | 92 0.00GET /users/2/ 1 0(0.00%) 102 102 102 | 100 0.00
--------------------------------------------------------------------------------------------------------------------------------------------Total 4 0(0.00%) 0.00Name # reqs # fails Avg Min Max | Median req/s
--------------------------------------------------------------------------------------------------------------------------------------------GET /groups/1/ 3 0(0.00%) 129 101 147 | 140 0.00GET /users/1/ 3 0(0.00%) 108 92 128 | 100 0.00GET /users/2/ 1 0(0.00%) 102 102 102 | 100 0.00
--------------------------------------------------------------------------------------------------------------------------------------------Total 7 0(0.00%) 0.00Name # reqs # fails Avg Min Max | Median req/s
--------------------------------------------------------------------------------------------------------------------------------------------GET /groups/1/ 4 0(0.00%) 125 101 147 | 110 1.00GET /groups/2/ 2 0(0.00%) 136 116 156 | 120 0.00GET /users/1/ 3 0(0.00%) 108 92 128 | 100 1.00GET /users/2/ 2 0(0.00%) 102 102 102 | 100 0.33
--------------------------------------------------------------------------------------------------------------------------------------------Total 11 0(0.00%) 2.33Name # reqs # fails Avg Min Max | Median req/s
--------------------------------------------------------------------------------------------------------------------------------------------GET /groups/1/ 5 0(0.00%) 123 101 147 | 120 0.75GET /groups/2/ 3 0(0.00%) 124 100 156 | 120 0.50GET /users/1/ 3 0(0.00%) 108 92 128 | 100 0.75GET /users/2/ 4 0(0.00%) 114 102 153 | 100 0.25
--------------------------------------------------------------------------------------------------------------------------------------------Total 15 0(0.00%) 2.25Name # reqs # fails Avg Min Max | Median req/s
--------------------------------------------------------------------------------------------------------------------------------------------GET /groups/1/ 6 0(0.00%) 128 101 157 | 120 0.67GET /groups/2/ 5 0(0.00%) 127 100 156 | 120 0.33GET /users/1/ 4 0(0.00%) 108 92 128 | 100 0.50GET /users/2/ 5 0(0.00%) 121 102 153 | 100 0.50
--------------------------------------------------------------------------------------------------------------------------------------------Total 20 0(0.00%) 2.00[2018-08-21 10:13:13,691] LAPTOP-8B5JADC8/INFO/locust.main: Time limit reached. Stopping Locust.
[2018-08-21 10:13:13,693] LAPTOP-8B5JADC8/INFO/locust.main: Shutting down (exit code 0), bye.Name # reqs # fails Avg Min Max | Median req/s
--------------------------------------------------------------------------------------------------------------------------------------------GET /groups/1/ 6 0(0.00%) 128 101 157 | 120 0.67GET /groups/2/ 5 0(0.00%) 127 100 156 | 120 0.33GET /users/1/ 4 0(0.00%) 108 92 128 | 100 0.50GET /users/2/ 5 0(0.00%) 121 102 153 | 100 0.50
--------------------------------------------------------------------------------------------------------------------------------------------Total 20 0(0.00%) 2.00Percentage of the requests completed within given timesName # reqs 50% 66% 75% 80% 90% 95% 98% 99% 100%
--------------------------------------------------------------------------------------------------------------------------------------------GET /groups/1/ 6 140 140 150 150 160 160 160 160 157GET /groups/2/ 5 120 150 150 160 160 160 160 160 156GET /users/1/ 4 110 110 130 130 130 130 130 130 128GET /users/2/ 5 100 150 150 150 150 150 150 150 153
--------------------------------------------------------------------------------------------------------------------------------------------Total 20 120 140 150 150 160 160 160 160 157
分布式运行
上面我们都是单台机器来执行性能测试,但是当单台机器不够模拟足够多的用户时,Locust支持运行在多台机器中进行压力测试。分布式运行一般是一台master 多台slave 如下图所示:

首先定义一台 master
C:\Users\Shuqing>locust -f D:\api_test\locust\locust_users_groups.py --master
然后定义 slave
C:\Users\Shuqing>locust -f D:\api_test\locust\locust_users_groups.py --slave
如果slave与master不在同一台机器上,还需要通过--master-host参数再指定master的IP地址。
C:\Users\Shuqing>locust -f D:\api_test\locust\locust_users_groups.py --slave --master-host <master_ip>
运行之后可以看到web界面显示的SLAVES数量

相关文章:
Locust接口性能测试
谈到性能测试工具,我们首先想到的是LoadRunner或JMeter。LoadRunner是非常有名的商业性能测试工具,功能非常强大。但现在一般不推荐使用该工具来进行性能测试,主要是使用也较为复杂,而且该工具体积比较大,需要付费且价…...
Python类的特殊方法(通过故事来学习)
在一座森林里,住着三只动物:狼、兔和熊。这三只动物都有不同的特点和能力,但是它们所有的行为都可以被抽象成一个“动物”类。现在,让我们来看看Python中的类和特殊方法如何帮助我们实现这个故事。 首先,我们可以定义…...
Vue.js 中的父子组件通信方式
Vue.js 中的父子组件通信方式 在 Vue.js 中,组件是构建应用程序的基本单元。当我们在应用程序中使用组件时,组件之间的通信是非常重要的。在 Vue.js 中,父子组件通信是最常见的组件通信方式之一。在本文中,我们将讨论 Vue.js 中的…...
Python之并发编程二多进程理论
一、什么是进程 进程:正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。 二、进程与程序的区别 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程。 三、并发与并行 无论是并行还是并发,在用户看来都是’同时’运行的&am…...
纯干货:数据库连接耗时慢原因排查
背景 最近公司的社区相关的服务需要优化,由于对业务不熟悉,只能借助监控从一些慢接口开始尝试探索慢的原因。由于社区相关的功能务是公司小程序流量入口,所以相应的服务访问量还是比较高的。针对这类高访问的项目,任何不留神的地…...
【OneNet】| stm32+esp8266-01s—— OneNet初体验 | 平台注册及设备创建 | demo使用
系列文章目录 失败了也挺可爱,成功了就超帅。 文章目录 前言1. OneNet平台注册2. 创建多协议接入设备3. 硬件连接4. 下载并运行Demo4.1 Demo下载4.2 运行Demo本小节结束 前言 最近准备耍下 Onenet平台 。下载了官方demo 遇到几个问题 1、创建接入设备 因为平台网页…...
解决win无法删除多层嵌套文件夹
起因:昨天研究jpackage工具,不小心搞得一个文件夹里嵌套了好几百个文件夹,用win自己的删除删不掉,shiftdel直接删除也不行,直接弹窗删除错误; 后来用电脑管家下载了个“文件粉碎”,添加目录&am…...
用Vue简单开发一个学习界面
文章目录 一.首先创建我们的Vue文件夹二.源代码BodyDemoHearderDemoHomeDemoMarkdownDemoFileManager.jsMain.js(注意绑定)APP源代码 效果图(按钮功能)新增二级菜单(v-for)需要的可以私信 一.首先创建我们的…...
Oracle数据库从入门到精通系列之五:数据文件
Oracle数据库从入门到精通系列之五:数据文件 一、数据文件二、Oracle数据库存储分配单位三、Oracle数据库文件系统机制四、段五、区段六、块七、表空间八、Oracle数据库存储层次体系小结一、数据文件 数据文件和重做文件是数据库中最重要的文件,数据最终会存储在这些文件中。…...
使用MockJS进行前端开发中的数据模拟
在前端开发中,有时我们需要在没有后端接口的情况下进行前端页面的开发和测试。这时,我们可以使用MockJS来模拟数据,以便进行开发和调试。MockJS是一个用于生成随机数据和拦截Ajax请求的JavaScript库,它能够帮助我们快速搭建起一个…...
Ex-ChatGPT本地部署+Azure OpenAI接口配置+docker部署服务
Ex-ChatGPT项目分为 Ex-ChatGPT 和 WebChatGPTEnhance 两部分,Ex-ChatGPT启动后是个web服务,通过访问ip端口体验; WebChatGPTEnhance可编译生成一个浏览器插件,Chrome或者Microsoft edge浏览器可以安装该插件,点击该插…...
【收藏】FP独立站建站安心收款经验分享
前几天有个客户咨询我,跟我说了他的疑问。他是在阿里巴巴国际站上面做鞋服,但看到同行在独立站上铺fp,所以他想问问:怎么建立一个独立站并在上面成功推出fp呢?今天,我就来跟有类似诉求的朋友们分享一下&…...
python:绘制GAM非线性回归散点图和拟合曲线
作者:CSDN _养乐多_ 本文将介绍使用python语言绘制广义线性模型(Generalized Additive Model,GAM)非线性回归散点图和拟合曲线。并记录了计算RMSE、ubRMSE、R2、Bias的代码。 文章目录 一、GAM非线性回归详解二、代码三、计算RM…...
每日算法(第十四期)
儿童节了也要好好学习鸭。 先来回顾一下上期的问题及答案: 「反转链表」(Reverse Linked List)。 题目描述: 反转一个单链表。 以下是对应的JavaScript实现: function reverseList(head) {let prev null;let curr he…...
uboot的使用
目录 串口调试 1.uboot模式 自启动模式: 交互模式 2.uboot帮助命令 3.uboot环境变量 4.uboot常用环境变量 5.uboot网络传输命令 6.uboot存储器访问命令 7.uboot自启动环境变量 串口调试 1.串口连接开发板,通过 "设备管理器" 获取对…...
学习HCIP的day.09
目录 一、BGP:边界网关路由协议 二、BGP特点: 三、BGP数据包 四、BGP的工作过程 五、名词注解 六、BGP的路由黑洞 七、BGP的防环机制—水平分割 八、BGP的基本配置 一、BGP:边界网关路由协议 是一种动态路由协议,且是…...
Electron-Builder Windows系统代码签名
前言 项目打包签名是两年前做的了,使用Electron-Bulder,打包工具版本迭代较少,倒是electron版本更新飞快,目前官方推荐使用Electron Forge进行打包,后续再对两者进行对比,重新整理现在的实现方案。 签名简…...
数据分析概述
数据分析概述 数据的性质数据的概念数据与信息的区别和联系 数据的类型按照度量尺度分按时间状况分 什么是数据分析数据分析的重要性数据分析的内容数据分析作用 数据分析的基本流程典型的数据分析的流程 数据分析方法对比分析法分组分析法定量数据分布分析——具体事例 结构分…...
网络编程初识
如果这篇有没接触过的知识点,请转到网络编程先导知识_小梁今天敲代码了吗的博客-CSDN博客 目录 IPv4和IPv6的概念: 子网掩码 默认网关 ping命令 端口 OSI网络分层模型 TCP/IP四层模型 字节序转换函数 IP地址转换 上一篇介绍了网络编程的先导知…...
软考A计划-试题模拟含答案解析-卷十二
点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
