一文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自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

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

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值