• 1
  • 1
分享

1. Locust基本介绍

1.1 引言

现在不管是互联网行业或者是传统行业,对性能的要求,都日渐增多,

为了能更快更准确的定位问题,发现问题,解决问题,

市面上出现了越来越多的性能测试工具,例如Jmeter,Loadrunner,Locus等,而今天,我们主要介绍的,就是Locust!

很多人并不知道什么是Locust,包括使用python的人,因为不涉及到,所以不会去可以了解,

那么,什么是Loucst,以及Locust的功能,有点是啥呢,

跟着小鱼,往下看~

1.2 简介

Locust是开源的使用Python开发,基于事件,支持分布式并且提供Web UI进行测试执行和结果展示的性能测试工具。

1.Locust 与Jmeter占用资源比较

        Locust之所以在资源占用方面完胜开源的Jmeter,

        主要是因为:

        >>两者的模式用户方式不同:

        ①Jmeter是通过线程来作为虚拟用户

        ②Locust借助gevent库对协程的支持,以greenlet来实现对用户的模拟你。

        所以,在相同配置下,Locust能支持的并发用户数相比Jmeter,就不止提升了一个Level。

2.Locust使用语言

    Locust使用的是Python代码定义测试场景,目前支持Python2.7,3.3~3.7。

    它自带一个Web UI,用于定义用户模型,发起测试,实时测试数据,错误统计等。

3.官方文档

更多更详细的内容,可以参考:

    1.文档内容,点击:官方文档

    2.源代码,点击:Github

2. Locust安装方式

同样,我们直接 pip安装即可

2.1 安装 locust

pip install  locust

2.2 安装pyzmq

如果打算运行Locust 分布在多个进程/进程,需要安装pyzmq

同样使用pip安装

pip install pyzmq

注:

    如果安装 locust-1.2.3 版本,可能就不需要再次安装pyzmq了,

    好像直接附带安装 pyzmq

2.3 安装成功确认

打开cmd窗口,直接输入

locust --help

如果出现下图,则说明安装成功

2020091511575131.png

3. Locust 参数说明

针对上图的安装成功后,我们来进行参数解析

3.1 参数信息

我们先把locust --help 里面的所有信息,copy出来

Common options:
  -h, --help            show this help message and exit
  -f LOCUSTFILE, --locustfile LOCUSTFILE
                        Python module file to import, e.g. '../other.py'.
                        Default: locustfile
  --config CONFIG       Config file path
  -H HOST, --host HOST  Host to load test in the following format:
                        http://10.21.32.33
  -u NUM_USERS, --users NUM_USERS
                        Number of concurrent Locust users. Primarily used
                        together with --headless
  -r SPAWN_RATE, --spawn-rate SPAWN_RATE
                        The rate per second in which users are spawned.
                        Primarily used together with --headless
  -t RUN_TIME, --run-time RUN_TIME
                        Stop after the specified amount of time, e.g. (300s,
                        20m, 3h, 1h30m, etc.). Only used together with
                        --headless
  -l, --list            Show list of possible User classes and exit
Web UI options:
  --web-host WEB_HOST   Host to bind the web interface to. Defaults to '*'
                        (all interfaces)
  --web-port WEB_PORT, -P WEB_PORT
                        Port on which to run web host
  --headless            Disable the web interface, and instead start the load
                        test immediately. Requires -u and -t to be specified.
  --web-auth WEB_AUTH   Turn on Basic Auth for the web interface. Should be
                        supplied in the following format: username:password
  --tls-cert TLS_CERT   Optional path to TLS certificate to use to serve over
                        HTTPS
  --tls-key TLS_KEY     Optional path to TLS private key to use to serve over
                        HTTPS
Master options:
  Options for running a Locust Master node when running Locust distributed. A Master node need Worker nodes that connect to it before it can run load tests.
  --master              Set locust to run in distributed mode with this
                        process as master
  --master-bind-host MASTER_BIND_HOST
                        Interfaces (hostname, ip) that locust master should
                        bind to. Only used when running with --master.
                        Defaults to * (all available interfaces).
  --master-bind-port MASTER_BIND_PORT
                        Port that locust master should bind to. Only used when
                        running with --master. Defaults to 5557.
  --expect-workers EXPECT_WORKERS
                        How many workers master should expect to connect
                        before starting the test (only when --headless used).
Worker options:
  Options for running a Locust Worker node when running Locust distributed.
  Only the LOCUSTFILE (-f option) need to be specified when starting a Worker, since other options such as -u, -r, -t are specified on the Master node.
  --worker              Set locust to run in distributed mode with this
                        process as worker
  --master-host MASTER_NODE_HOST
                        Host or IP address of locust master for distributed
                        load testing. Only used when running with --worker.
                        Defaults to 127.0.0.1.
  --master-port MASTER_NODE_PORT
                        The port to connect to that is used by the locust
                        master for distributed load testing. Only used when
                        running with --worker. Defaults to 5557.
Tag options:
  Locust tasks can be tagged using the @tag decorator. These options let specify which tasks to include or exclude during a test.
  -T [TAG [TAG ...]], --tags [TAG [TAG ...]]
                        List of tags to include in the test, so only tasks
                        with any matching tags will be executed
  -E [TAG [TAG ...]], --exclude-tags [TAG [TAG ...]]
                        List of tags to exclude from the test, so only tasks
                        with no matching tags will be executed
Request statistics options:
  --csv CSV_PREFIX      Store current request stats to files in CSV format.
                        Setting this option will generate three files:
                        [CSV_PREFIX]_stats.csv, [CSV_PREFIX]_stats_history.csv
                        and [CSV_PREFIX]_failures.csv
  --csv-full-history    Store each stats entry in CSV format to
                        _stats_history.csv file. You must also specify the '--
                        csv' argument to enable this.
  --print-stats         Print stats in the console
  --only-summary        Only print the summary stats
  --reset-stats         Reset statistics once spawning has been completed.
                        Should be set on both master and workers when running
                        in distributed mode
Logging options:
  --skip-log-setup      Disable Locust's logging setup. Instead, the
                        configuration is provided by the Locust test or Python
                        defaults.
  --loglevel LOGLEVEL, -L LOGLEVEL
                        Choose between DEBUG/INFO/WARNING/ERROR/CRITICAL.
                        Default is INFO.
  --logfile LOGFILE     Path to log file. If not set, log will go to
                        stdout/stderr
Step load options:
  --step-load           Enable Step Load mode to monitor how performance
                        metrics varies when user load increases. Requires
                        --step-users and --step-time to be specified.
  --step-users STEP_USERS
                        User count to increase by step in Step Load mode. Only
                        used together with --step-load
  --step-time STEP_TIME
                        Step duration in Step Load mode, e.g. (300s, 20m, 3h,
                        1h30m, etc.). Only used together with --step-load
Other options:
  --show-task-ratio     Print table of the User classes' task execution ratio
  --show-task-ratio-json
                        Print json data of the User classes' task execution
                        ratio
  --version, -V         Show program's version number and exit
  --exit-code-on-error EXIT_CODE_ON_ERROR
                        Sets the process exit code to use when a test result
                        contain any failure or error
  -s STOP_TIMEOUT, --stop-timeout STOP_TIMEOUT
                        Number of seconds to wait for a simulated user to
                        complete any executing task before exiting. Default is
                        to terminate immediately. This parameter only needs to
                        be specified for the master process when running
                        Locust distributed.
User classes:
  UserClass             Optionally specify which User classes that should be
                        used (available User classes can be listed with -l or
                        --list)

3.2 参数信息解析

这里,只写了大部分,至于缺少的部分,小鱼觉得不太常用,就不浪费浪费电了~毕竟1度电 1块多钱 ! !

还有,就是小鱼要吃午饭~

-h, --help    查看帮助
-H HOST, --host=HOST    指定被测试的主机,采用以格式:http://10.21.32.33
--web-host=WEB_HOST    指定运行 Locust Web 页面的主机,默认为空 ''。
-P PORT, --port=PORT, --web-port=PORT    指定 --web-host 的端口,默认是8089
-f LOCUSTFILE, --locustfile=LOCUSTFILE    指定运行 Locust 性能测试文件,默认为: locustfile.py
--csv=CSVFILEBASE, --csv-base-name=CSVFILEBASE    以CSV格式存储当前请求测试数据。
--master    Locust 分布式模式使用,当前节点为 master 节点。
--slave    Locust 分布式模式使用,当前节点为 slave 节点。
--master-host=MASTER_HOST    分布式模式运行,设置 master 节点的主机或 IP 地址,只在与 --slave 节点一起运行时使用,默认为:127.0.0.1.
--master-port=MASTER_PORT    分布式模式运行, 设置 master 节点的端口号,只在与 --slave 节点一起运行时使用,默认为:5557。注意,slave 节点也将连接到这个端口+1 上的 master 节点。
--master-bind-host=MASTER_BIND_HOST    Interfaces (hostname, ip) that locust master should bind to. Only used when running with --master. Defaults to * (all available interfaces).
--master-bind-port=MASTER_BIND_PORT    Port that locust master should bind to. Only used when running with --master. Defaults to 5557. Note that Locust will also use this port + 1, so by default the master node will bind to 5557 and 5558.
--expect-slaves=EXPECT_SLAVES    How many slaves master should expect to connect before starting the test (only when --no-web used).
--no-web    no-web 模式运行测试,需要 -c 和 -r 配合使用.
-c NUM_CLIENTS, --clients=NUM_CLIENTS    指定并发用户数,作用于 --no-web 模式。
-r HATCH_RATE, --hatch-rate=HATCH_RATE    指定每秒启动的用户数,作用于 --no-web 模式。
-t RUN_TIME, --run-time=RUN_TIME    设置运行时间, 例如: (300s, 20m, 3h, 1h30m). 作用于 --no-web 模式。
-L LOGLEVEL, --loglevel=LOGLEVEL    选择 log 级别(DEBUG/INFO/WARNING/ERROR/CRITICAL). 默认是 INFO.
--logfile=LOGFILE    日志文件路径。如果没有设置,日志将去 stdout/stderr
--print-stats    在控制台中打印数据
--only-summary    只打印摘要统计
--no-reset-stats    Do not reset statistics once hatching has been completed。
-l, --list    显示测试类, 配置 -f 参数使用
--show-task-ratio    打印 locust 测试类的任务执行比例,配合 -f 参数使用.
--show-task-ratio-json    以 json 格式打印 locust 测试类的任务执行比例,配合 -f 参数使用.
-V, --version    查看当前 Locust 工具的版本.

3.3 Locust主要库

①gevent

    gevent是一种基于协程的Python网络库,它用到Greenlet提供的,封装了libevent事件循环的高层同步API。

②flask

    Python编写的轻量级Web应用框架。

    如果想了解flask及代码实战,看小鱼的这篇文章:

    《Python3,网站搭建之构建Flask项目》

③requests

    Python的HTTP库

    可以参考小鱼的这篇文章《requests库常用到的7个主要方法及控制访问参数》

④msgpack-python

    MessagePack是一种快速、紧凑的二进制序列化格式,适用于类似JSON的数据格式。msgpack-python主要提供MessagePack数据序列化及反序列化的方法。

⑤six

    Python2和3兼容库,用来封装Python2和Python3之间的差异性

⑥ pyzmq

    pyzmq是zeromq(一种通信队列)的Python绑定,主要用来实现Locust的分布式模式运行。

4. Locust类说明

4.1 client属性

①在Locust类中,静态字段client即客户端的请求方法,这里的client字段没有绑定客户端请求方法,因此在使用Locust时,需要先继承Locust类class HttpLocust(Locust),然后在self.client =HttpSession(base_url=self.host)绑定客户端请求方法;

②对于常见的HTTP(s)协议,Locust已经实现了HttpLocust类,其self.client=HttpSession(base_url=self.host),而HttpSession继承自requests.Session。

③在测试HTTP(s)的Locust脚本中,可以通过client属性来使用Python requests库的所 有方法,调用方式与 reqeusts完全一致。

④由于requests.Session的使用,client的方法调用之间就自动具有了状态记忆功能。

⑤常见的场景就是,在登录系统后可以维持登录状态的Session,从而后续HTTP请求操作都能带上登录状态。

4.2 其他属性

4.2.1 task_set

指向一个TaskSet类,TaskSet类定义了用户的任务信息,该静态字段为必填。

4.2.2 max_wait/min_wait

每个用户执行两个任务间隔的上下限(毫秒),具体数值在上下限中随机取值,若不指定则默认间隔时间为1秒。

4.2.3 host

被测试系统的host,当在终端中启动locust时没有指定–host参数时才会用到。

4.2.4 weight

同时运行多个Locust类时,用于控制不同类型的任务执行权重。

5. Loucst执行流程

具体流程如下:

    ①先执行WebsiteTasks中的on_start(只执行一次),作为初始化;   

    ②从WebsiteTasks中随机挑选(如果定义了任务间的权重关系,那么就按照权重关系随机挑选)一个任务执行;  

    ③根据Locust类中min_wait和max_wait定义的间隔时间范围(如果TaskSet类中也定义了min_wait或者max_wait,以TaskSet中的优先),在时间范围中随机取一个值,休眠等待;  

    ④重复2~3步骤,直到测试任务终止。

6. 性能测试工具比较

关于如何选择性能测试工具,小鱼在《深聊性能测试,从入门到放弃之:初识性能测试》写过,

每个工具,都有自己存在的价值,即,存在即有意义

接下来,小鱼给大家分析一下,Jmeter、Loadrunner、Locust这三个工具。

无标题.png

通过对比,可以看到,Locust并不占优,但是,小鱼喜欢用这个的原因,

是因为:

1、首先是模拟用户操作

①Locust采用Pure Python脚本描述,并且HTTP请求完全基于Requests库。

②Requests这个库非常简洁易用,但功能十分强大,很多其它编程语言的HTTP库都借鉴了它的思想和模式,如果将其评选为最好用的HTTP库之一(不限语言),应该也不会有太大的争议。

③除了HTTP(S)协议,Locust也可以测试其它任意协议的系统,只需要采用Python调用对应的库进行请求描述即可。

2、并发机制

①Locust的并发机制采用协程(gevent)的机制。

②采用多线程来模拟多用户时,线程数会随着并发数的增加而增加,而线程之间的切换是需要占用资源的,IO的阻塞和线程的sleep会不可避免的导致并发效率下降;正因如此,LoadRunner和Jmeter这类采用进程和线程的测试工具,都很难在单机上模拟出较高的并发压力。

③而协程和线程的区别在于:协程避免了系统级资源调度,由此大幅提高了性能。

④正常情况下,单台普通配置的测试机可以生产数千并发压力,这是LoadRunner和Jmeter都无法实现的。

7. Locust代码实战

代码实战部分,我放到了第二章节来展示。

可以直接点击传送

《深聊性能测试,从入门到放弃之:Locust性能自动化(二)代码实战》

小屌丝:鱼哥,你能不能先分享一点,Locust的界面是啥样子?

小鱼:额, 就不能等等嘛~~

小屌丝: 我觉得不能,你就给个图,看看,到底牛X的地方是啥?

小鱼:好的,等着明天! 我得吃饭去了!!!


  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 重新认识自动化测试我从事软件测试工作以来,第一次知道自动化是 15 年年底,听大佬说 QTP 可以录制脚本然后自动化回放,测试效率很高,当时心向往之。不过当时技术比较菜,而且对工作也比较迷茫,听过就忘记了。大概 16 年时候,测试圈子自动化测试开始火爆了起来,当时基于 selenium 的 UI 自动化测试特别火爆。圈子里讨论,培训班推广,很多关于基于 selenium 的 UI 自动化测试的技术文章和书籍开始不断涌现。我本人是 17 年年初才开始学习自动化测试并且尝试在工作中应用的,确实在回归测试和造数据方面,给了我很多的帮助,当然由于比较早吃螃蟹,在后面跳槽找工作时候,涨薪幅度也挺大。大概...
            0 0 2088
            分享
          • 前言相信搞过Python的人绝大部分都会一点点爬虫技能,但是很多时候爬虫也不是万能的,这个时候就需要我们的自动化测试框架了,于是Selenium就应运而生了,它可以算的上是自动化测试框架中的佼佼者,因为它解决了大多数用来爬取页面的模块的一个永远的痛,那就是Ajax异步加载,今天小编就带大家来好好了解下这个Selenium 。一、安装与导入这里我们需要安装三个东西,一个是Selenium框架,还有一个浏览器,最后就是驱动。这里小编选择了谷歌浏览器,下载地址:https://u062.com/file/7715018-455263626。然后Selenium框架嘛,大家都会下的啦,PIP就搞定了,...
            15 17 3167
            分享
          •        1、用户并发性能测试用例       用户并发测试是性能测试的最主要部分,包含了负载测试和压力测试的过程。主要是逐渐增加用户数量来加重系统负担,直到出现不能接收的性能点或者瓶颈。一般要测试正常数量的用户并发和极限数量下用户并发的情况。       并发用户测试主要是对系统的核心功能和重要业务进行测试,要以真实的业务数据作为输入,选择有代表性和关键的业务操作来设计测试用例。主要编写以下两个方面的用例:       核心模块的...
            0 0 4932
            分享
          •   1. 测试稳定性问题  理想情况下,我们希望每一个失败的测试用例都是由真正的缺陷引起的。实际情况中,用例失败的原因大多是一些其他的原因:  ·某个服务的版本部署的不对  ·测试执行机的硬盘满了,因为上次运行时写的log没清掉  ·数据库里有脏数据  ·测试用例写得有问题  ·测试运行时有人手工执行了一次定时任务,把流水捞走了  ·消息串了  ...  每次排查都是一堆这种问题,时间久了,开发和测试同学也就疲了。有些同学对失败的用例草草看一眼,就说这是一个“环境问题”,不再排查下去了。如此一来,很多真正的缺陷就被漏过了。  2. 测试稳定性三板斧  如何治理测试稳定性问题?很多人会...
            11 12 2346
            分享
          •   之前在项目中用LoadRunner进行并发性能测试,后改用Jmeter更为简便快捷,笔者认为这也是开源工具颇受欢迎的原因之一吧。本次继之前的分享更新了一版,近期项目做个小结,希望大家也可以有新的收获!  下载  官网https://archive.apache.org/dist/jmeter/,选择binaries。目前最新5.6.3,官网上说“应该避免使用比最后一个版本早3个版本的版本”。笔者习惯不使用最新的版本,免得不稳定,大家可以使用5.0以上的都行,2、3版本的bug比较多。  环境配置  一、配置环境变量  系统变量中新建JMETER_HOME,值为安装路径D:\dev\apac...
            0 0 448
            分享
      • 51testing软件测试圈微信