51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1683|回复: 2
打印 上一主题 下一主题

Locust源码分析之基本用法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-3-26 10:53:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1. Locust介绍

Locust是一个用于可扩展的,分布式的,性能测试的,开源的,用Python编写框架/工具,它非常容易使用,也非常好学。

它的主要思想就是模拟一群用户将访问你的网站。每个用户的行为由你编写的python代码定义,同时可以从Web界面中实时观察到用户的行为。

Locust完全是事件驱动的,因此在单台机器上能够支持几千并发用户访问。

与其它许多基于事件的应用相比,Locust并不使用回调,而是使用gevent,而gevent是基于协程的,可以用同步的方式来编写异步执行的代码。

每个用户实际上运行在自己的greenlet中。



2, 性能测试工具Jmeter和Locust对比

Jmeter 同样是非常有名的开源性能测试工具,功能也很完善,在本书中介绍了它作为接口测试工具的使用。但实际上,它是一个标准的性能测试工具。关于Jmeter相关的资料也非常丰富,它的官方文档也很完善。

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

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

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

3,Locust安装

方式一:pip安装

pip install locust

方式二:从github安装

GitHub项目地址:https://github.com/locustio/locust/

将项目克隆下来,通过Python 执行 setup.py 文件

python setup.py install

安装要求:

install_requires=[“gevent>=1.1.2”, “flask>=0.10.1”, “requests>=2.9.1”, “msgpack-python>=0.4.2”, “six>=1.10.0”, “pyzmq==15.2.0”]

gevent 是在 Python 中实现协程的一个第三方库。协程,又称微线程(Coroutine)。使用gevent可以获得极高的并发性能。

flask 是 Python 的一个 Web 开发框架。

Requests 用来做 HTTP 接口测试。

msgpack-python 是一种快速、紧凑的二进制序列化格式,适用于类似JSON的数据。

six 提供了一些简单的工具用来封装 Python2 和 Python3 之间的差异性。

pyzmq 如果你打算运行 Locust 分布在多个进程/机器,建议你安装pyzmq。



4,Locust用法

(1)基本用法

main.py代码如下:
  1. from locust import HttpLocust, TaskSet, task

  2. class UserBehavior(TaskSet): ## UserBehavior类继承TaskSet类,用于描述用户行为。
  3.     '''
  4.     TaskSet类定义了每个用户的任务集合,测试任务开始后,每个 Locust 用户会从 TaskSet 中随机挑选一个任务执行,然后随机等待 HttpLocust 类中定义的 min_wait和 max_wait 之间的一段时间,执行下一个任务。
  5.     '''
  6.     @task() ## 使用@task装饰该方法为一个事务。client.get()用于指请求的路径
  7.     def test_01_ph_baisc_info(self):
  8.         resp = self.client.get('/v1/resources/acPowerChargers/PH-NIO-43010001-CS014992/basicInfos', timeout=30)
  9.         assert resp.status_code == 200

  10.     @task()
  11.     def test_02_pc_baisc_info(self):
  12.         resp = self.client.get('/v1/resources/dcPowerChargers/PC-SIM-0038725a-859f5c8f/basicInfos', timeout=30)
  13.         assert resp.status_code == 200


  14. class PerfUser(HttpLocust):
  15.     '''
  16.     PerfUser类用于设置性能测试。
  17.     task_set :指向一个定义的用户行为类。
  18.     min_wait :执行事务之间用户等待时间的下界(单位:毫秒)。
  19.     max_wait :执行事务之间用户等待时间的上界(单位:毫秒)。
  20.     host: 如果是 Web 服务的测试,host 相当于是提供 URL 前缀的默认值,但是如果在命令行中指定了 --host 选项,则以命令行中指定的为准。如果不是 Web 服务测试,使用默认的 None 就好。
  21.     stop_timeout: 设置 Locust 多少秒后超时,如果为 None ,则不会超时。
  22.     weight: 一个Locust实例被挑选执行的权重,数值越大,执行频率越高。在一个 locustfile.py 文件中可以同时定义多个 HttpLocust 子类,然后分配他们的执行权重
  23.     '''
  24.     task_set = UserBehavior
  25.     weight = 1
  26.     min_wait = 3000
  27.     max_wait = 6000
  28.     stop_timeout = 5
  29.     host = 'https://www.baidu.com'
复制代码

运行代码:

locust -f main.py --host=http://###douban.com.cn###


参数说明:

-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 工具的版本.


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-23 03:40 , Processed in 0.067159 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表