Locust
安装:
https://www.locust.io/
locust 文档
https://docs.locust.io/en/stable/
1. 开始
locast 完全基于事件,因此可以在一台机器上支持数千个并发用户。与其他许多基于事件的
应用程序不同,它不使用回调。相反,它通过 gevent 使用轻量级流程。每一只蝗虫聚集在
你的站点中实际上是在它自己的进程中运行的(正确地说,是 greenlet)。这使您可以用
Python 编写非常有表现力的场景,而不必使用回调使代码复杂化。
http://www.gevent.org/
1.1 什么是 locust
1.1.1 特性
用普通的 Python 编写用户测试场景
分布式和可扩展-支持数十万用户
基于 Web 的用户界面
可以测试任何系统
可破解的
1.2 安装
https://docs.locust.io/en/stable/installation.html
还是用虚拟环境安装吧!!!
$ pip3 install locust
$ pip3 install -e git://github.com/locustio/locust.git@master#egg=locust
安装好之后,可以执行命令:
$ locust --help
1.2.1 增加最大打开文件数限制
机器上的每个 HTTP 连接都会打开一个新文件(技术上是一个文件描述符)。操作系统可能
会为可打开的最大文件数设置一个下限。如果限制小于测试中模拟的用户数,则会发生失败。
将操作系统的默认最大文件数限制增加到比要运行的模拟用户数更大的数目。如何做到这一
点取决于所使用的操作系统。
1.3 快速开始
在 locast 中,可以用 Python 代码定义用户行为。然后,在收集请求统计信息时,您可以使
用 locast 命令和(可选)其 web 界面来生成和模拟许多这样的用户。
1.3.1 举例 locustfile.py
下面是拆分分解:
在这里,我们为用户定义了一个类,我们将模拟这个类。它从 HttpUser 继承而来,HttpUser
为每个用户提供一个 client 属性,这是 HttpSession 的一个实例,可用于向我们要加载测试
的目标系统发出 HTTP 请求。当一个测试开始时,locast 将为它所模拟的每个用户创建这个
类的一个实例,并且每个用户都将开始在他们自己的 green gevent 线程中运行。
我们的类定义了一个 wait_time 函数,它将使模拟用户在每个任务执行后等待 5 到 9 秒。
我们还通过用@task 装饰两个方法来声明两个任务,其中一个方法的权重更高(3)。当这
种类型的用户运行时,它会选择 index_page 或 view_item 中的一个,选择 view_item 的几
率是 3 倍,调用该方法,然后选择一个介于 5 和 9 之间的持续时间,并在该持续时间内保
持睡眠。在等待时间过后,它会选择一个新的任务并不断重复。
在view_item 任务中,我们通过使用一个查询参数加载一个动态URL,该参数是在1 到10000
之间随机选取的一个数字。为了避免在 locust 的统计信息中获得 10k 个单独的条目(因为
统计数据是在 URL 上分组的),我们使用 name 参数将所有这些请求分组到名为“/item”的
条目下。
请注意,只有用@task 修饰的方法才会被调用,因此您可以按照自己喜欢的方式定义自己的
内部助手方法:
另外,我们还声明了一个 on_start 方法。当每个模拟用户启动时,将为其调用具有此名称
的方法。
1.3.2 启动 Locust
将上述代码放入名为 locustfile.py 在当前目录中运行:
$ locust
如果您的 locust 文件位于其他位置,可以使用-f 指定它:
$ locust -f locust_files/my_locust_file.py
1.3.3 Web 接口
一 旦 您 使 用 上 述 命 令 行 之 一 启 动 了 locust , 您 应 该 打 开 一 个 浏 览 器 并 将 其 指 向
http://127.0.0.1:8089。那么你应该得到这样的问候:
1.3.4 多选择
要在多个 Python 进程或机器上运行 locust,可以使用--master 命令行参数启动单个 locust
主进程,然后使用--worker 命令行参数启动任意数量的 locust 工作进程。
要在不使用 web 界面的情况下直接启动测试,请使用--headless。
1.4 写一个 locustfile
至少要写一个类 user class - 继承于 User
1.4.1 User class
一个 user 类代表一个用户(如果愿意的话,也可以是成群结队的蝗虫)。蝗虫将为每个正
在模拟的用户生成(孵化)一个 User 类实例。用户类通常应该定义一些属性。
wait_time attribute
除了 tasks 属性之外,还应该声明 wait_time 方法。它用于确定模拟用户在执行任务之间等
待多长时间。蝗虫附带了一些内置函数,这些函数返回一些常见的等待时间方法。
最常见的是介于两者之间 between。它用于让模拟用户在每个任务执行后等待一个介于最
小值和最大值之间的随机时间。其他内置的等待时间函数是 constant 和 constant_pacing。
使用以下 locustfile,每个用户在任务之间等待 5 到 15 秒:
wait_time 方法应返回秒数(或秒的一小部分),也可以在 TaskSet 类上声明,在这种情况
下,它将仅用于该任务集。
也可以直接在用户或任务集类上声明自己的等待时间方法。下面的用户类将开始睡眠一秒
钟,然后是 1、2、3 等。
weight attribute
如果文件中存在多个用户类,并且没有在命令行中指定用户类,那么 locust 将生成相等数
量的每个用户类。您还可以通过将这些类作为命令行参数传递来指定要从同一个 locustfile
中使用的用户类:
$ locust -f locust_file.py WebUser MobileUser
如果您希望模拟更多特定类型的用户,可以在这些类上设置一个 weight 属性。例如,网络
用户的可能性是移动用户的三倍:
host attribute
host 属性是一个 URL 前缀(即 http://google.com)发送到要加载的主机。通常,这是在 locust
的 web ui 中指定的,或者在启动 locust 时使用--host 选项在命令行上指定。
如果在 user 类中声明了一个 host 属性,那么当命令行或 web 请求中没有指定--host 时,
将使用该属性。
tasks attribute
用户类可以使用@task decorator 将任务声明为其下的方法,但也可以使用 tasks 属性指定
任务,这将在下面详细介绍。
environment attribute
对用户运行所在环境的引用。使用此选项可与环境或其包含的运行程序交互。比如:要阻止
跑步者使用任务方法:
如果在独立的蝗虫实例上运行,这将停止整个运行。如果在 worker 节点上运行,它将停止
该特定节点。
1.4.2 Tasks class
当负载测试开始时,将为每个模拟用户创建一个 User 类的实例,并且它们将在自己的绿色
线程中开始运行。当这些用户运行时,他们选择要执行的任务,休眠一段时间,然后选择一
个新任务,依此类推。
这些任务是普通的 python 可调用的,如果我们在测试一个拍卖网站,它们可以执行诸如“加
载起始页面”、“搜索产品”、“出价”等任务。
声明 tasks
为用户类(或任务集)声明任务的典型方法是使用任务装饰器。
@task 接受可选的 weight 参数,可用于指定任务的执行率。在下面的例子中,任务 2 被选
中的几率为 2 倍:
Tasks 属性
使用@task decorator 声明任务是一种方便,通常也是最好的方法。但是,也可以通过设置
tasks 属性来定义用户或 TaskSet 的任务(使用@task decorator 实际上只填充 tasks 属性)。
tasks 属性可以是一个 Task 列表,或者是一个dict,其中 Task 是 python 可调用
类或 TaskSet 类(更多信息见下文)。如果任务是一个普通的 python 函数,它们会收到一
个参数,即执行任务的用户实例。
如果将 tasks 属性指定为列表,则每次执行任务时,将从 tasks 属性中随机选择它。但是,
如果 tasks 是 dict—以 callables 为键,int 为值—将要执行的任务将随机选择,但以 int 为
比率。所以对于这样的任务:
my_task 执行的可能性是 another_task 的 3 倍。
在内部,上面的 dict 实际上会展开为一个列表(tasks 属性也会更新),如下所示:
然后是 Python 的 random.choice() 用于从列表中选择任务。
Tagging tasks
通过使用标签标记任务decorator,您可以使用--tags 和--exclude tags 参数对
测试期间执行的任务进行挑剔。考虑以下示例:
如果使用--tags tag1 启动此测试,则在测试期间只执行 task1 和 task2。如果以--tags tag2
tag3 开始,则只执行 task2 和 task3。
--exclude-tags 的行为方式正好相反。因此,如果使用--exclude-tags tag3 启动测试,则只
执行 task1、task2 和 task4。排除总是胜于包含,所以如果一个任务有一个你已经包含的标
记和一个被你排除的标记,它将不会被执行。
1.4.3 TaskSet class
因为真正的网站通常是以分层的方式建立的,有多个子部分,所以 locust 有 TaskSet 类。
蝗虫任务不仅可以是 Python 可调用的,而且可以是 TaskSet 类。TaskSet 是 locust 任务的
集合,这些任务的执行方式与直接在用户类上声明的任务非常相似,用户在任务执行之间处
于休眠状态。下面是一个简短的示例,其中包含一个任务集: