Locust接口性能测试

news2024/12/23 8:39:29

谈到性能测试工具,我们首先想到的是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数量

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

temu,速卖通,国际站如何稳定安全的测评补单,提升权重不降权

随着互联网和电子商务的快速发展&#xff0c;越来越多的企业和个人通过测评&#xff0c;补单进行产品推广和销售。然而&#xff0c;在测评&#xff0c;补单过程中&#xff0c;如何稳定安全地进行&#xff0c;以提升权重而不降权&#xff0c;成为了许多经营者关注的重要问题。林…

day44_项目1

今日内容 零、 复习昨日 零、 复习昨日 一、web开发流程 1.公司部门的组成人事部门HR技术部门(研发部/IT部/java组/h5组/c组/ui组/产品)行政部门财务部门市场部门运营部门总经理老板/董事/CEO2.项目部人员的组成 各种开发人员: UI/前端/后端(java/c/Python/c/android/Object-c…

CTFShow-WEB入门篇--信息搜集详细Wp

CTFShow-WEB入门篇详细Wp 信息收集&#xff1a;web1&#xff1a;web2&#xff1a;web3&#xff1a;web4&#xff1a;web5&#xff1a;web6&#xff1a;web7&#xff1a;web8&#xff1a;web9&#xff1a;web10&#xff1a;web11&#xff1a;web12&#xff1a;web13&#xff1a;…

基于linux的程序库文件打包和调用的实现(二)——动态库文件打包和调用

随着技术的发展&#xff0c;基于linux项目的软件代码越发复杂&#xff0c;原来一个人可以完成的软件项目&#xff0c;现在可能需要多个人合作、多个部门合作、多个企业合作&#xff0c;每个人、每个部门、每个企业可能负责部分软件模块的开发。各个软件模块在调试过程由于涉及企…

测试思想-集成测试 关于接口测试 Part 2

5. 用例设计思想(举例说明) 如上表&#xff0c;是某个接口说明文档中的一个接口&#xff0c;课程检索&#xff0c;其中“v1/Lesson/testsrch/?” 为接口调用地址&#xff0c;此外&#xff0c;还给出了接口函数输出(即Server Response)及返回值。 问&#xff1a;怎么设计&…

如何免费在线把Figma转成Sketch

我相信所有的设计师都非常熟悉新的设计工具。Figma以其在线合作的特点受到设计师的欢迎。然而&#xff0c;对于设计师来说&#xff0c;在实际工作中&#xff0c;有时需要使用Sketch编辑Figma文件。 今天推荐一款Figma转换Sketch文件格式的免费工具。 下面具体介绍如何通过即时…

chatgpt赋能python:Python内置函数表

Python内置函数表 Python是一种高级编程语言&#xff0c;具有许多内置函数&#xff0c;可用于各种用途&#xff0c;例如处理字符串、操作文件、执行数学计算等等。在本文中&#xff0c;我们将介绍Python内置函数表并讨论其中的一些常见用途。 什么是Python内置函数&#xff1…

JavaFX 树视图TreeView

JavaFX 树视图TreeView 1、TreeView基础查看2、显示案例 1、TreeView基础查看 javafx.scene.control.TreeView<T> javafx.scene.control.TreeItem<T> w3cschool&#xff1a;JavaFX 树视图 DOC-03-14 树视图(Tree View) JavaFX视频教程第101课&#xff0c;TreeView…

List 的使用

1. List 列表视图实现增删改操作 /// 列表视图 struct ListBootcamp: View {/// 水果State var fruits: [String] ["apple", "orange", "banana", "peach"]/// 蔬菜State var veggies: [String] ["tomato", "potato…

【笔试强训编程题】Day4.(计算糖果 46579 ) 和(进制转换 58541)

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训编程题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录…

如何在Moonbeam DAPP质押GLMR

Moonbeam自上线以来一直稳步成长&#xff0c;并致力于为以太坊生态的项目提供一个进入波卡生态的入口。Moonbeam的官方质押Dapp于今年3月迎来一次大改版&#xff0c;旨在为用户提供更直观的质押操作体验。了解升级版Dapp详情&#xff0c;请阅读此文章。 当然大家最关心也是如何…

JavaEE 简单前后端分离小项目 - 表白墙

plus版表白墙&#xff01;✿✿ヽ(▽)ノ✿ 文章目录 JavaEE & 简单前后端分离小项目 - 表白墙1. body格式约定 - 应用层协议2. 后端处理请求2.1 模板2.2 doGet方法2.3 doPost方法 3. 前端制作请求并解析响应3.1 原前端页面的代码3.2 刷新时发送GET请求3.3 点击发送时构造Pos…

Photoshop 2023 v24.5/24.6beta版「支持M1、支持神经滤镜、FireflyAI 新功能」

24.6beta试用FireflyAI 新功能&#xff0c;需要外网ID, 并且要先试用&#xff0c;后激活 psv24.5支持神经滤镜&#xff0c;激活前需要登录Adobe账号试用&#xff0c;退出后再去运行激活补丁&#xff01; Photoshop 2023 v24.5/24.6beta版「支持M1、支持神经滤镜、FireflyAI 新…

【开源项目】ChatGPT智能聊天系统后台管理解析

ChatGPT是likeshop近期新研发出来的一款AI智能聊天对话的产品&#xff0c;此系统是基于likeadmin-PHP开发的智能对话系统&#xff0c;ChatGPT是一种基于人工智能技术的聊天机器人&#xff0c;它可以与用户进行自然语言对话&#xff0c;提供各种服务和答案。ChatGPT的核心技术是…

海绵城市智慧监测系统功能、适用范围有哪些?

一、海绵城市在线监测系统拓扑图 海绵城市在线监测系统是通过RTU使用3G/4G信号进行无线传输等方式&#xff0c;将温度、水位、风速、风向、雨量、色度、浊度等数据传输到在线监测平台。经过软件平台的系统性处理后再通过LED显示屏直观、快捷的展现给用户。用户也可以通过电脑、…

【Unity Optimize】Unity中的优化工具和优化方法介绍

目录 1 Unity项目优化的必要性2 Unity自带的优化工具2.1 Profiler窗口Profile Analyzer 2.2 Stats窗口2.3 Frame Debugger窗口 3 其他优化方法3.1 批处理&#xff08;Batching&#xff09;3.2 内存管理&#xff08;Memory Handling&#xff09;3.3 对象池&#xff08;Object Po…

linux部署mysql服务

记录阿里云服务器linux上部署mysql服务。 文章目录 1. 下载rpm包2. 上传解压rpm包3. 安装rpm包4. 启动mysql服务5. 修改root的密码6. 创建远程连接用户7. 检查防火墙8. 阿里云安全组开放3306端口9. 远程连接10. 停止数据库服务 1. 下载rpm包 mysql下载rpm包&#xff0c;链接&…

性能测试如何入门?熬夜7天整理出这一份3000字超全学习指南

赶鸭子上架要我搞性能测试&#xff0c;怎么办&#xff1f; 我第一次真正意义上搞性能测试是在2014年。项目组要求搞性能测试&#xff0c;我之前也没搞过&#xff0c;对服务端也不熟悉。就那么一脸懵逼地开始搞性能。当时我连linux上有哪些能看系统资源的命令都不知道。稀里糊涂…

是否应该学习Qt作为主要编程语言C/C++的补充?

如果您以C/C作为主要编程语言&#xff0c;学习Qt是一个不错的选择。主要还是学习Qt的思想。 在初期阶段&#xff0c;您可以学习如何使用Qt设计界面。您可以使用Qt Designer拖拽控件&#xff0c;这样做比较直观。当然&#xff0c;您也可以手写代码实现界面。 Qt目前主要提供了…

第十八篇、基于Arduino uno,获取手势识别传感器的信号——结果导向

0、结果 说明&#xff1a;该传感器模块集手势识别和触摸检测功能于一体&#xff0c;提供0~30cm以内的可调检测范围。它可以检测 5 向触摸信号和 7 种手势&#xff1a;向左移动、向右移动、向前移动、向后移动、向上拉、向下拉、拉和移除。 1、外观 说明&#xff1a;虽然手势…