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 '' (all
                        interfaces)
  -P PORT, --port=PORT, --web-port=PORT
                        Port on which to run web host
  -f LOCUSTFILE, --locustfile=LOCUSTFILE
                        Python 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,task

class 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 = UserBehavior
    min_wait = 3000
    max_wait = 6000


UserBehavior类继承TaskSet类,用于描述用户行为。

  • @task装饰该方法为一个事务,后面的数字表示请求比例,上面的比例为2:1 默认都是1:1
  • test_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,task

class UserBehavior(TaskSet):

    def on_start(self):
        #设置user和group参数下标初始值
        self.users_index=0
        self.groups_index=0

    @task
    def 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)

    @task
    def 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 = 3000
    max_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.00

 Name                                                          # reqs      # fails     Avg     Min     Max  |  Median   req/s
--------------------------------------------------------------------------------------------------------------------------------------------
 GET /groups/1/                                                     2     0(0.00%)     134     122     146  |     120    0.00
 GET /users/1/                                                      2     0(0.00%)     118     100     136  |     100    0.00
--------------------------------------------------------------------------------------------------------------------------------------------
 Total                                                              4     0(0.00%)                                       0.00

 Name                                                          # reqs      # fails     Avg     Min     Max  |  Median   req/s
--------------------------------------------------------------------------------------------------------------------------------------------
 GET /groups/1/                                                     4     0(0.00%)     135     122     146  |     130    1.00
 GET /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 stats

 Name                                                          # reqs      # fails     Avg     Min     Max  |  Median   req/s
--------------------------------------------------------------------------------------------------------------------------------------------
 GET /groups/1/                                                     1     0(0.00%)     147     147     147  |     150    0.00
 GET /users/1/                                                      2     0(0.00%)     110      92     128  |      92    0.00
 GET /users/2/                                                      1     0(0.00%)     102     102     102  |     100    0.00
--------------------------------------------------------------------------------------------------------------------------------------------
 Total                                                              4     0(0.00%)                                       0.00

 Name                                                          # reqs      # fails     Avg     Min     Max  |  Median   req/s
--------------------------------------------------------------------------------------------------------------------------------------------
 GET /groups/1/                                                     3     0(0.00%)     129     101     147  |     140    0.00
 GET /users/1/                                                      3     0(0.00%)     108      92     128  |     100    0.00
 GET /users/2/                                                      1     0(0.00%)     102     102     102  |     100    0.00
--------------------------------------------------------------------------------------------------------------------------------------------
 Total                                                              7     0(0.00%)                                       0.00

 Name                                                          # reqs      # fails     Avg     Min     Max  |  Median   req/s
--------------------------------------------------------------------------------------------------------------------------------------------
 GET /groups/1/                                                     4     0(0.00%)     125     101     147  |     110    1.00
 GET /groups/2/                                                     2     0(0.00%)     136     116     156  |     120    0.00
 GET /users/1/                                                      3     0(0.00%)     108      92     128  |     100    1.00
 GET /users/2/                                                      2     0(0.00%)     102     102     102  |     100    0.33
--------------------------------------------------------------------------------------------------------------------------------------------
 Total                                                             11     0(0.00%)                                       2.33

 Name                                                          # reqs      # fails     Avg     Min     Max  |  Median   req/s
--------------------------------------------------------------------------------------------------------------------------------------------
 GET /groups/1/                                                     5     0(0.00%)     123     101     147  |     120    0.75
 GET /groups/2/                                                     3     0(0.00%)     124     100     156  |     120    0.50
 GET /users/1/                                                      3     0(0.00%)     108      92     128  |     100    0.75
 GET /users/2/                                                      4     0(0.00%)     114     102     153  |     100    0.25
--------------------------------------------------------------------------------------------------------------------------------------------
 Total                                                             15     0(0.00%)                                       2.25

 Name                                                          # reqs      # fails     Avg     Min     Max  |  Median   req/s
--------------------------------------------------------------------------------------------------------------------------------------------
 GET /groups/1/                                                     6     0(0.00%)     128     101     157  |     120    0.67
 GET /groups/2/                                                     5     0(0.00%)     127     100     156  |     120    0.33
 GET /users/1/                                                      4     0(0.00%)     108      92     128  |     100    0.50
 GET /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.67
 GET /groups/2/                                                     5     0(0.00%)     127     100     156  |     120    0.33
 GET /users/1/                                                      4     0(0.00%)     108      92     128  |     100    0.50
 GET /users/2/                                                      5     0(0.00%)     121     102     153  |     100    0.50
--------------------------------------------------------------------------------------------------------------------------------------------
 Total                                                             20     0(0.00%)                                       2.00

Percentage of the requests completed within given times
 Name                                                           # reqs    50%    66%    75%    80%    90%    95%    98%    99%   100%
--------------------------------------------------------------------------------------------------------------------------------------------
 GET /groups/1/                                                      6    140    140    150    150    160    160    160    160    157
 GET /groups/2/                                                      5    120    150    150    160    160    160    160    160    156
 GET /users/1/                                                       4    110    110    130    130    130    130    130    130    128
 GET /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

如果slavemaster不在同一台机器上,还需要通过--master-host参数再指定master的IP地址。

C:\Users\Shuqing>locust -f D:\api_test\locust\locust_users_groups.py --slave --master-host <master_ip>

运行之后可以看到web界面显示的SLAVES数量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/25121.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UE5的IK Rig重定向注意问题

推荐先把官方文档看仔细&#xff0c;明白IK Rig重定向原理&#xff0c;对理解UE5怎么进行动画骨骼重定向&#xff0c;以及重定向后骨骼出现问题应该怎么调整非常有帮助。 IK Rig重定向 主要功能点 IK Rig IK Rig的作用是定义两个转化关系中的源骨骼和目标骨骼的主要部件的骨…

Linux——网络套接字2|Tcp服务器编写

本篇博客先看后面的代码,再回来看上面这些内容。 .hpp文件,基本调用 服务器基本框架

ASEMI代理KY可控硅BT169的工作原理及应用领域

编辑-Z 本文主要介绍了可控硅BT169的工作原理及其在各个领域的用。首先&#xff0c;我们将详细阐述可控硅BT169的工作原理&#xff0c;包括结构特点、工作过程等&#xff1b;其次&#xff0c;我们将探讨可控硅BT169在家用电器、工业控制、电力电子等领域的应用。 1、可控硅BT1…

进程(三)

进程三 2.11 进程同步、进程互斥2.11.1 进程同步2.11.2 进程互斥2.11.3 总结 2.12 进程互斥和软件实现方法2.12.1 单标志法2.12.2 双标志先检查法2.12.3 双标志后检查法2.12.4 Peterson 算法2.12.5 总结 2.13 进程互斥和硬件实现方法2.13.1 中断屏蔽方法2.13.2 TestAndSet 指令…

Makefile基础教程(路径搜索)

文章目录 前言一、常用的源码管理方式二、VPATH和vpath1.VPATH2.vpath3.VPATH和vpath优缺点对比三、VPATH和vpath同时出现make会怎么处理四、vpath指定多个文件夹总结前言 在前面的文章中我们的文件全部都是放在同一个目录下面的,那么在实际的工程开发中会这样做吗?答案肯定…

使用Nodejs搭建简单的HTTP服务器 - 内网穿透公网远程访问

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 转载自cpolar内网穿透的文章&#xff1a;使用Nodejs搭建HTTP服务&#xff0c;并实现公网远程访问「内网穿透」 前言 Node.…

【满分】【华为OD机试真题2023B卷 JAVAJS】经典屏保

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 经典屏保 知识点循环迭代编程基础 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: DVD机在视频输出时,为了保护电视显像管,在待机状态会显示“屏保动画”,如下图所示,DVD Logo在屏幕内来回运动,碰到边缘会反弹…

macOS visual studio code 没有读写权限 检查更新报错

问题描述 visual studio code 检查更新&#xff0c;报错&#xff0c;visual studio code没有磁盘读写权限。&#xff08;可能会导致插件安装报错&#xff1f;&#xff09; 报错&#xff1a;The application is on a read-only volume. Please move the application and try a…

【JavaSE】Java基础语法(十一):String、StringBuilder详解

文章目录 &#x1f378;1. String类&#x1f349;&#x1f349;1.1 String概述&#x1f349;&#x1f349;1.2 String类的构造方法&#x1f349;&#x1f349;1.3 创建字符串对象的区别对比&#x1f349;&#x1f349;1.4 字符串的比较1.4.1 字符串的比较 &#x1f349;&#x…

移动云镜像配置BC-Linux --配置centos 6-7-8版本参考

移动云BC linux 也是一个非常不错的镜像站. 可以加速国内下载. 非常好用, 速度比阿里 等那些流行的镜像站快一些. 下面介绍详解操作配置, 供参考 移动云开源镜像站-Linux系统订阅服务 移动云开源镜像站&#xff0c;包含BC-Linux各版本的软件仓库&#xff0c;对外提供软件升级…

sql注入学习-知识点大合集

目录 &#xff08;一&#xff09;sql注入了解&#xff1a; 1.1什么是sql注入 1.2 sql注入的分类 &#xff08;二&#xff09;sql注入详解&#xff1a; 2.1.MySQL注入 2.2.1在MySQL注入中&#xff0c;会用到的知识 2.2.2mysql常用语句与常见 2.2.3msyql注入内容详解 2.2…

【JavaSE】Java基础语法(十三):Java 中的集合(十分全面)

文章目录 List, Set, Queue, Map 四者的区别&#xff1f;集合框架底层数据结构总结ArrayList 和 Vector 的区别ArrayList 与 LinkedList 区别补充内容:RandomAccess 接⼝ArrayList 的扩容机制comparable 和 Comparator 的区别比较 HashSet、LinkedHashSet 和 TreeSet 三者的异同…

JS逆向系列之猿人学爬虫第9题-动态cookie2

文章目录 目标参数流程分析js代码Python调用测试目标 https://match.yuanrenxue.cn/match/9参数流程分析 二次请求cookie携带m 第一次请求响应内容格式化之后是这样的: < body > < script src = "/static/match/safety/match9/udc.js" > <

Office Visio 2007安装教程

哈喽&#xff0c;大家好。今天一起学习的是Visio 2007的安装&#xff0c;这是一个绘制流程图的软件&#xff0c;用有效的绘图表达信息&#xff0c;比任何文字都更加形象和直观。Office Visio 是office软件系列中负责绘制流程图和示意图的软件&#xff0c;便于IT和商务人员就复杂…

【WebRTC】音视频通信

WebRTC对等体还需要查找并交换本地和远程音频和视频媒体信息&#xff0c;例如分辨率和编解码器功能。 交换媒体配置信息的信令通过使用被称为SDP的会话描述协议格式来交换&#xff0c;被称为提议和应答的元数据块 WebRTC 音视频通信基本流程 一方发起调用 getUserMedia 打开本…

Go网络通信

Go中HTTP协议客户端实现 Go语言标准库内置了net/http包&#xff0c;涵盖了HTTP客户端和服务端具体的实现方式。内置的net/http包提供了最简洁的HTTP客户端实现方式&#xff0c;无须借助第三方网络通信库&#xff0c;就可以直接使用HTTP中用得最多的GET和POST方式请求数据。 fun…

【Python】内置函数

文章目录 反射相关【4】基础数据类型相关【38】和数字相关&#xff08;14&#xff09;数据类型 <4>bool([x])int((x, base10)float([x])complex([real[, imag]]) 进制转换 <3>bin(x)oct(x)hex(x) 数学运算&#xff08;7&#xff09;abs(x)divmod(a, b)round(x [, n…

vue 阻止事件冒泡常用的方法

在 Vue 中&#xff0c;阻止事件冒泡有两种常用方法&#xff1a; 1. 使用 event.stopPropagation() 方法&#xff1a; 在事件处理函数中&#xff0c;可以通过调用事件对象的 stopPropagation() 方法来阻止事件冒泡。例如&#xff1a; html <template> <div click"…

00后太卷了,搞的我们这些老油条太难受了......

前几天我们公司一下子也来了几个新人&#xff0c;这些年前人是真能熬啊&#xff0c;本来我们几个老油子都是每天稍微加会班就打算走了&#xff0c;这几个新人一直不走&#xff0c;搞得我们也不好走。 2023年春招结束了&#xff0c;最近内卷严重&#xff0c;各种跳槽裁员&#x…

报表控件FastReport使用指南——使用NuGet包创建PDF文档

FastReport 是功能齐全的报表控件&#xff0c;可以帮助开发者可以快速并高效地为.NET&#xff0c;VCL&#xff0c;COM&#xff0c;ActiveX应用程序添加报表支持&#xff0c;由于其独特的编程原则&#xff0c;现在已经成为了Delphi平台最优秀的报表控件&#xff0c;支持将编程开…