一文6000字从0到1使用Locust做性能测试【建议收藏】

01、Locust介绍

Locust 一个开源性能测试工具,使用Python代码来定义用户行为,用它可以模拟百万计的并发用户访问你的系统。

性能工具对比:

图片

LoadRunner 是非常有名的商业性能测试工具,功能非常强大。使用也比较复杂,目前大多介绍性能测试的书籍都以该工具为基础,甚至有些书整本都在介绍 LoadRunner 的使用。

Jmeter 同样是非常有名的开源性能测试工具,功能也很完善,它可以作为接口测试工具的使用。但实际上,它是一个标准的性能测试工具

Locust 同样是性能测试工具,虽然官方这样来描述它 “An open source load testing tool.” ,但其它和前面两个工具有着较大的不同。相比前面两个工具,功能上要差上不少,但它也并非优点全无。

  • Locust 完全基于 Python 编程语言,采用 Pure Python 描述测试脚本,并且 HTTP 请求完全基于 Requests 库。除了 HTTP/HTTPS 协议,Locust 也可以测试其它协议的系统,只需要采用Python调用对应的库进行请求描述即可。

  • LoadRunner 和 Jmeter 这类采用进程和线程的测试工具,都很难在单机上模拟出较高的并发压力。Locust 的并发机制摒弃了进程和线程,采用协程(gevent)的机制。协程避免了系统级资源调度,由此可以大幅提高单机的并发能力。

02、Locust安装

pip安装

pip install locust

源码安装

git clonehttps://github.com/locustio/locust/

cd locust

python setup.py install

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】

03、创建性能测试

01、编写简单脚本

from locust import HttpLocust, TaskSet, task

# 定义用户行为

class UserBehavior(TaskSet):

    # 任一测试用例执行前均会执行一次

    def on_start(self):

        print('开始性能测试')

    @task(1)

    # 表示一个用户为行,访问百度首页。使用 @ task装饰该方法为一个事务。client.get()用于指请求的路径“ / ”,因为是百度首页,所以指定为根路径。

    def index(self):

        self.client.get("/")

    @task(2) # task()参数用于指定该行为的执行权重。参数越大每次被虚拟用户执行的概率越高。如果不设置默认为1。

    def index2(self):

        self.client.get(

            "/s?wd=locust&rsv_spt=1&rsv_iqid=0xbb8514200006b7d0&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_sug3=8&rsv_sug1=9&rsv_sug7=101&rsv_sug2=0&inputT=1458&rsv_sug4=1911&rsv_sug=2")

# 用于设置性能测试

class WebsiteUser(HttpLocust):

    # 指向一个定义的用户行为类。

    task_set = UserBehavior

    # 执行事务之间用户等待时间的下界(单位:毫秒)。如果TaskSet类中有覆盖,以TaskSet 中的定义为准。

    min_wait = 3000

    # 执行事务之间用户等待时间的上界(单位:毫秒)。如果TaskSet类中有覆盖,以TaskSet中的定义为准。

    max_wait= 6000

    # 设置 Locust 多少秒后超时,如果为 None ,则不会超时。

    stop_timeout = 5

    # 一个Locust实例被挑选执行的权重,数值越大,执行频率越高。在一个 locustfile.py 文件中可以同时定义多个 HttpLocust 子类,然后分配他们的执行权重

    weight = 3

    # 脚本指定host执行测试时则不在需要指定

    host = "https://www.baidu.com"

02、执行测试

1、web执行

启动服务

locust -f test.py --host=https://www.baidu.com

locust -f test.py  # 如果脚本中已经指定host,则不需要再次指定

  • -f:指定性能测试脚本文件

  • –host:指定被测试应用的URL的地址,注意访问百度使用的HTTPS协议

执行测试

通过浏览器访问:http://localhost:8089(Locust启动网络监控器,默认为端口号为: 8089)

图片

Number of users to simulate 设置模拟用户数

Hatch rate(users spawned/second) 每秒产生(启动)的虚拟用户数

点击 “Start swarming” 按钮,开始运行性能测试

图片

结果说明

  • Type:请求的类型,例如GET/POST

  • Name:请求的路径。这里为百度首页,即:https://www.baidu.com/

  • request:当前请求的数量

  • fails:当前请求失败的数量

  • Median:中间值,单位毫秒,一半的服务器响应时间低于该值,而另一半高于该值

  • Average:平均值,单位毫秒,所有请求的平均响应时间

  • Min:请求的最小服务器响应时间,单位毫秒

  • Max:请求的最大服务器响应时间,单位毫秒

  • Content Size:单个请求的大小,单位字节

  • reqs/sec:是每秒钟请求的个数

2、no-web执行

locust -f test.py --host=https://www.baidu.com --no-web -c 10 -r 2 -t 1m

locust -f test.py --no-web -c 10 -r 2 -t 1m # 如果脚本中已经指定host,则不需要再次指定

  • –no-web:表示不使用Web界面运行测试

  • -c:设置虚拟用户数

  • -r:设置每秒启动虚拟用户数

  • -t:设置设置运行时间

关闭服务可直接Ctrl+C

03、分布式运行

一旦单台机器不够模拟足够多的用户时,Locust支持运行在多台机器中进行压力测试。

为了实现这个,你应该在 master 模式中使用–master标记来启用一个 Locust 实例。这个实例将会运行你启动测试的 Locust 交互网站并查看实时统计数据。master 节点的机器自身不会模拟任何用户。相反,你必须使用 --slave 标记启动一台到多台 Locustslave 机器节点,与标记 --master-host 一起使用(指出master机器的IP/hostname)。

常用的做法是在一台独立的机器中运行master,在slave机器中每个处理器内核运行一个slave实例。

注意:master 和每一台 slave 机器,在运行分布式测试时都必须要有 locust 的测试文件

在 master 模式下启动 Locust:

locust -f my_loucstfile.py --master

在每个 slave 中执行(192.168.0.14 替换为你 master 的IP):

locust -f my_locustfile.py --slave --master-host=192.168.0.14

参数说明

--master  设置 Locust 为 master 模式。网页交互会在这台节点机器中运行。

--slave  设置 Locust 为 slave 模式。

--master-host=X.X.X.X  可选项,与 --slave 一起结合使用,用于设置 master 模式下的 master 机器的IP/hostname(默认设置为127.0.0.1)

--master-port=5557  可选项,与 --slave 一起结合使用,用于设置 master 模式下的 master 机器中 Locust 的端口(默认为5557)。注意,locust 将会使用这个指定的端口号,同时指定端口+1的号也会被占用。因此,5557 会被使用,Locust将会使用 5557 和 5558。

--master-bind-host=X.X.X.X`  可选项,与 --master 一起结合使用。决定在 master 模式下将会绑定什么网络接口。默认设置为*(所有可用的接口)。

--master-bind-port=5557  可选项,与 --master 一起结合使用。决定哪个网络端口 master 模式将会监听。默认设置为 5557。注意 Locust 会使用指定的端口号,同时指定端口+1的号也会被占用。因此,5557 会被使用,Locust 将会使用 5557 和 5558。

--expect-slaves=X  在 no-web 模式下启动 master 时使用。master 将等待X连接节点在测试开始之前连接。

04、权重分配

Locust支持同一脚本中使用权重的方式达到用例被执行频率不同的问题(例如用户流失,浏览用户100人,注册只有50人),不同于Jmeter、LandRunner权重分配方式并不是标准的比例。

权重1 - task

# -*- coding: utf-8 -

from locust import HttpLocust, TaskSet, task

class TestLocust(TaskSet):

    def on_start(self):

        print('开始性能测试')

    @task(1)

    def test_demo_get1(self):

       self.client.get(url="/mock_server/configs/info")

    @task(2)

    def test_demo_get2(self):

        self.client.get("/mock_server/mock/show_lists")

class Query(HttpLocust):

    task_set = TestLocust

    min_wait = 1000

    max_wait = 3000

    host = http://localhost:5000

方法的参数用于指定该行为的执行权重。参数越大每次被虚拟用户执行的概率越高。如果不设置默认为1。

权重2 - weight

# -*- coding: utf-8 -

from locust import HttpLocust, TaskSet, task

class TestLocust(TaskSet):

    def on_start(self):

        print('开始性能测试')

    @task

    def test_demo_get(self):

        self.runLocust(demoGet.demo_get())

class TestLocust2(TaskSet):

    def on_start(self):

        print('开始性能测试')

    @task

    def test_demo_post(self):

        page_num, num = 10, 1

        self.runLocust(demoPost.demo_post(page_num, num))

class QueryOne(HttpLocust):

    task_set = TestLocust

    min_wait = 1000

    max_wait =3000

    weight = 1

    host = http://localhost:5000

class QueryTwo(HttpLocust):

    task_set = TestLocust2

    min_wait = 1000

   max_wait = 3000

    weight = 3

    host = http://localhost:5000

执行语句不同

 

locust -f test.py QueryOne QueryTwo

weight

一个Locust实例被挑选执行的权重,数值越大,执行频率越高。在一个 locustfile.py 文件中可以同时定义多个 HttpLocust 子类,然后分配他们的执行权重

图片

05、参数化

参数化首先需要清楚locust的执行逻辑,定义的用户行为下带有task装饰器的函数才会被协程不断的执行

from locust import HttpLocust, TaskSet, task

from random import randint

data1 = randint(1, 3)

# 定义用户行为

class UserBehavior(TaskSet):

    def on_start(self):

        print('开始性能测试')

    @task(1)

    def index(self):

        print(data1)

        self.client.get("/")

    @task(2)

    def index2(self):

        data2 = randint(1, 3)

        print(data2)

        self.client.get(

            "/s?wd=locust&rsv_spt=1&rsv_iqid=0xbb8514200006b7d0&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_sug3=8&rsv_sug1=9&rsv_sug7=101&rsv_sug2=0&inputT=1458&rsv_sug4=1911&rsv_sug=2")

class WebsiteUser(HttpLocust):

    task_set = UserBehavior

    min_wait = 3000

    max_wait = 6000

    stop_timeout = 5

    weight = 3

    host = "https://www.baidu.com"

图片

根据打印的结果就可以看出,data1被设为了全局变量,无论怎么多次执行值都不会变;data2被设为函数变量,因为每次执行该函数(接口进行一次请求),该变量都会重新执行发生变化。

因此,如果接口需要参数不重复,将该参数的生成方法写在执行函数中即可;如果接口需要的参数保持不变,将该参数写为全局变量即可

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:自动化测试老司机! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

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

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

相关文章

【漏洞复现】科立讯通信指挥调度平台editemedia.php sql注入漏洞

漏洞描述 在20240318之前的福建科立讯通信指挥调度平台中发现了一个漏洞。该漏洞被归类为关键级别,影响文件/api/client/editemedia.php的未知部分。通过操纵参数number/enterprise_uuid可导致SQL注入。攻击可能会远程发起。 免责声明 技术文章仅供参考,任何个人和组织使…

电工职业培训初级到高级,电工技术与试题资料大全

一、资料描述 本套电工全套资料,大小1.70G,共有178个文件,PDF文件为主。 二、资料目录 01-电工技术基础知识大全 02-电工基础知识 03-电工技术 04-电工操作技术 05-电工识图 06-电工口诀 07-电工手册 08-PLC的应用 09-电工电子电气…

用eclipse创建Web项目,通过Servlet实现Web访问的功能。

要使用Eclipse和Tomcat 10创建一个简单的Web项目,并通过Servlet实现Web访问功能,你需要遵循以下详细步骤: 1. 安装和配置Eclipse和Tomcat 10 确保你已经安装了Eclipse IDE for Java EE Developers和Tomcat 10。如果还没有安装,请…

【VALL-E-01】环境搭建

本系列文章系本人知乎账号迁移 本文系个人知乎专栏文章迁移 VALL-E 网络是GPT-SOVITS很重要的参考 知乎专栏地址: 语音生成专栏 相关文章链接: 【VALL-E-01】环境搭建 【VALL-E-02】核心原理 1、环境包使用 从效果看没有GPT-SOVITS 来的好 环境安装…

python + tensorflow 开局托儿所自动点击脚本

python开局托儿所自动点击脚本 屏幕截图图片数字识别消除算法自动点击 屏幕截图 python 屏幕截图可以使用pyautogui或者PIL。我使用的是PIL中的ImageGrab(要授权)。 image ImageGrab.grab(bbox(0, 0, tool.static_window_width, tool.static_window_height)) image np.arra…

后端如何返回404地址

当我们网站输入不存在的地址,经常会出现404的页面,这是如何做到的 1.添加配置 spring:mvc:view:prefix: /templates/suffix: .html 2.resources下添加templates目录,下面放404的网站 3.添加依赖,版本在主pom里面配置好了&#x…

springboot项目学习-瑞吉外卖(3)

1.任务 实现分类管理功能数据的添加实现分类管理数据的分页查询实现分类管理数据的删除 由于前两个业务和之前的业务基本一致,所以这里就不重点介绍了,只放代码 2.分类管理功能数据的添加 前提:导入category实体类 2.1.CategoryMapper接口 //…

海外基金牌照的优势及注意事项-华媒舍

一、了解海外基金牌照 在投资领域,海外基金牌照是指投资者可以通过获得海外金融监管机构颁发的许可证,参与海外基金投资。拥有海外基金牌照的投资者可以享受更广泛的投资机会,包括跨境投资、全球资产配置等。 二、海外基金牌照的优势 多元化…

【HarmonyOS】ArkUI - 页面路由

一、概念 页面路由是指在应用程序中实现不同页面之间的跳转和数据传递。 案例:第一次使用某个购物应用,打开时肯定会是一个登录页,在登录成功以后,会跳转到首页,然后可能会去搜索,就会进入到搜索列表页&am…

水下蓝牙耳机哪个好?必看4款购买单,拒绝踩雷!

在当今的科技时代,无线蓝牙耳机已经成为了我们生活中不可或缺的一部分。无论是运动、工作还是休闲娱乐,一款好的蓝牙耳机都能为我们带来极大的便利和乐趣。然而,在水下使用蓝牙耳机却是一个相对特殊的应用场景,需要考虑到防水、防…

力扣刷题Days25-45. 跳跃游戏 II(js)

目录 1,题目 2,代码 贪心算法正向查找 3,学习 解题思路 具体代码处理 数组遍历的最后边界的处理: 1,题目 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向…

Nuclei Poc开发

1、Poc开发工具介绍 Nuclei:https://nuclei.projectdiscovery.io/ Cloud Platfrom云平台:https://cloud.projectdiscovery.io/ 2、目标站点简介 目标演示站点:http://glkb-jqe1.aqlab.cn/nacos/#/login 指纹:Nacos 已知常用漏洞…

基于springboot+vue的农产品直卖平台

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

牛客竞赛语法入门班顺序结构习题(重现赛)(1031-1040)

本篇包含: 1、1031-时间转换 2、1032-温度转换 3、1033-计算机内存 4、1034-[NOIP2017]成绩 5、1035-KiKi的最高分 6、1036-组队比赛 7、1037-平方根 8、1038-长方体 9、1039-使徒袭来 10、1040-白兔的分身术 本篇包含考点: 1、小时、分钟和秒的转换 2、…

备战蓝桥杯Day35 - 动态规划 - 01背包问题

问题描述 隐含前提: 1.物体是不可分的,要么装,要么不装,不能只装一部分。 2.物体顶多使用一次。 动态规划思路 我在b站上看的闫氏dp分析大法的视频,他对dp问题做了总结归纳。 从集合的角度分析dp问题。求出有限集…

一款炫酷的python形状绘制动画库

这个库让复杂数学概念的可视化变得既简单又有趣,无论是线性代数、微积分,还是更高级的数学主题,Manim都能让它们栩栩如生,特别适合于制作数学视频和演示文稿。 特点 动画生成: Manim库提供了一套丰富的工具和方法&…

Install Docker

Docker Desktop 直接安装 Docker Desktop Docker Desktop includes the Docker daemon (dockerd), the Docker client (docker), Docker Compose, Docker Content Trust, Kubernetes, and Credential Helper. Linux下安装Docker CE 参考官方文档 参见阿里云的文档 # step 1…

Git 使用笔记

基本操作: 初始化 (git init) 使用背景和作用: 在本地建立一个文件夹后,基于这个文件夹进行git 操作,赋予git操作本文件夹的权限 。查看当前文件夹状态(git status) 每次打开文件夹…

算法系列--动态规划--子序列(1)

💕"深思熟虑的结果往往就是说不清楚。"💕 作者:Mylvzi 文章主要内容:算法系列–动态规划–子序列(2) 今天带来的是算法系列--动态规划--子序列(1),是子序列问题的开篇!带大家初识子序列问题 一.什么是子序列问题 我们…

6.volatile与JMM

文章目录 被 volatile 修饰的变量有两大特点volatile 的内存语义volatile 凭什么可以保证有序性和可见性? 内存屏障(面试重点)解读 volatile 的两大特性内存屏障 volatile 特性两大类读屏障(Load Barrier)写屏障(Store Barrier) 四小类C源码分析四类屏障特点 如何保证有序性?…