链接:https://www.jianshu.com/p/40102e9a24cb
安装
一般直接通过 pip 就可以安装:
$ pip install locust
注意:
Locust 1.x 版本与之前的设计有很大的颠覆,所以你看到的很多代码会与你在网上搜索到的代码不一致。
如果示例代码运行不成功,请升级你的 Locust。
快速开始
在 Locust 中,可以使用 Python 代码定义用户行为。然后,可以使用locust
命令及其 Web 界面生成大量虚拟用户并收集虚拟用户的请求统计信息。
一个 locustfile.py
import random
from locust import HttpUser, task, between
class QuickstartUser(HttpUser):
wait_time = between(5, 9)
@task
def index_page(self):
self.client.get("/hello") # 这里的地址需要排除 host 部分
self.client.get("/world")
@task(3)
def view_item(self):
item_id = random.randint(1, 10000)
self.client.get(f"/item?id={item_id}", name="/item")
def on_start(self):
self.client.post("/login", {"username":"foo", "password":"bar"})
对上面的代码进行分解:
import random
from locust import HttpUser, task, between
Locust 文件只是普通的 Python 代码文件,可以手动引入 Locust 相关的库以及你需要用到的其他第三方库。
class QuickstartUser(HttpUser):
在这里,我们为要模拟的用户定义一个类。它继承自HttpUser
,该属性为每个用户提供了一个 client 属性,该属性是HttpSession
的一个实例。可用于向负载测试的目标系统发出 HTTP 请求。当测试开始时,Locust 将为它每个虚拟用户创建一个此类的实例,并且每个虚拟用户会在自己的 gevent 线程中运行这些实例。
HttpUser 类是 Locust 1.x 版本中用来代替以前的 HttpLocust 类,用来定义虚拟用户。是 User 类的子类。
wait_time = between(5, 9) # 思考时间
我们的类定义了一个wait_time
函数,它将使模拟用户在每个任务执行后的 5 ~ 9 秒之间等待。等待时间主要为了模拟用户在实际使用过程中存在的思考时间,对实际用户在操作系统过程中来说,他/她不会无时无刻不停的操作系统,而是操作一下暂停思考下一步动作。
有关更多信息,请参见wait_time attribute.
@task
def index_page(self):
self.client.get("/hello")
self.client.get("/world")
@task(3)
def view_item(self):
...
通过用 @task
装饰了两个方法来声明了两项任务,其中一种具有更高的权重(@task(3)
)。只有通过 @task
装饰的方法才会在 Locust 虚拟用户运行过程中被调用。
当虚拟用户运行时,会从两个任务中选择一个运行,由于 view_item
的权重为 3,因此在选择任务时会有三倍的机会选择 view_item
。虚拟用户会根据权重调用一个方法来运行,运行后会根据wait_time
定义的等待时间休眠 5~9 秒。待休眠时间结束后,会重新根据权重调用一个新任务来执行,并循环重复。
在测试过程中,只有被
@task
定义的方法才会被调用。当然被定义为任务的方法可以调用你定义的其他方法。
@task(3)
def view_item(self):
item_id = random.randint(1, 10000)
self.client.get(f"/item?id={item_id}", name="/item")
在view_item
任务中,我们通过使用查询参数动态加载 URL,该查询参数是一个从 1 到 10000 之间随机选择的数字。为了避免在 Locust 的统计信息中获得 10k 个单独的条目(Locust 会根据 URL 分组统计信息),会使用名称参数name parameter
将所有这些请求分组到名为/item
的条目下。
注意,只有用
@task
装饰的方法才会被调用,因此可以在 locustfile.py 的测试类中随意定义其他的辅助方法,以提升测试场景的复杂和灵活性。
def on_start(self):
此外,我们还声明了on_start
方法。每个虚拟用户在启动时都会调用具有该方法。
有关更多信息,请参见on_start
和on_stop
方法。
on_start() 方法是 hook 函数之一,用来定义在一些特殊事件下触发的逻辑。 on_start() 方法是在虚拟用户启动(启动事件)时会触发的方法。
开始执行 Locust
将以上代码放在当前目录中名为locustfile.py
的文件中,然后运行:
$ locust
Locust 会默认查找当前目录下名为
locustfile.py
,如果该文件不在当前文件夹或者你取了其他的名字,就需要加上下面的-f
参数了。
如果你的locustfile.py
位于其他地方,则可以使用-f
参数指定它:
$ locust -f locust_files/my_locust_file.py
注意:要查看所有可用选项,请输入:
locust --help
或查看Configuration
Locust 的 web 界面
一旦使用上述命令行之一启动 Locust 后,会在本地开启一个服务并占用8089
端口,你可以打开浏览器并将其指向http://127.0.0.1:8089。
如果
http://127.0.0.1:8089
无法找到,你可以尝试一下 http://locust:8089。
然后,你会看到如下界面:
请根据表单内容填写,并尝试一下。
- Number of total users to simulate -> 最大并发用户数
- Hatch rate -> 孵化率(每秒生成的虚拟用户数)
- Host -> 被测系统的 Host(如果你在 User类 中定义了host 属性,会自动带出来,如果没有就需要输入)
孵化率 Hatch rate,在 Locust 中把生成虚拟用户这个过程称之为“孵化”。
更多选项
要运行分布在多个 Python 进程或计算机上的 Locust,可以使用--master
命令行参数启动单个 Locust 主进程,然后在--worker
命令行参数中使用任意数量的 Locust worker 进程。
更多关于分布式运行的信息,请参阅Locust 分布式运行
要直接开始测试而不使用 Web 界面,请使用--headless
。
也可以通过环境变量设置参数
Parameters can also be set through [environment variables],或写入配置文件config file。