Locust 快速入门
快速入门
locustfile.py
下面是一个简单的locustfile.py
的小示例
from locust import HttpLocust, TaskSet
def login(l):
l.client.post("/login", {"username":"ellen_key", "password":"education"})
def logout(l):
l.client.post("/logout", {"username":"ellen_key", "password":"education"})
def index(l):
l.client.get("/")
def profile(l):
l.client.get("/profile")
class UserBehavior(TaskSet):
tasks = {index: 2, profile: 1}
def on_start(self):
login(self)
def on_stop(self):
logout(self)
class WebsiteUser(HttpLocust):
task_set = UserBehavior
min_wait = 5000
max_wait = 9000
在这里,我们定义了许多Locust
任务,它们是带有一个参数(Locust
类实例)的普通 Python 可调用对象。这些任务收集在 task 属性中的TaskSet
类下 。然后,我们有一个代表用户的 类,其中定义了模拟用户在执行任务之间应等待的时间,以及 应该定义用户的“行为”的类。 类可以嵌套。Http``Locust``TaskSetTaskSet
在HttpLocust
从类继承 Locust
的类,并把它添加一个客户端属性,它是的一个实例 HttpSession
,可用于使HTTP
请求。
默认情况下,我们不再寻找代理设置以提高性能。如果您确实希望测试请求通过 HTTP 代理,则可以从HttpLocust
该类继承,并将 trust_env 字段设置为 True。有关更多详细信息,请参阅请求文档。
我们可以声明任务的另一种方法(通常更方便)是使用 @task
装饰器。
以下代码与上面的代码等效:
from locust import HttpLocust, TaskSet, task
class UserBehavior(TaskSet):
def on_start(self):
""" on_start is called when a Locust start before any task is scheduled """
self.login()
def on_stop(self):
""" on_stop is called when the TaskSet is stopping """
self.logout()
def login(self):
self.client.post("/login", {"username":"ellen_key", "password":"education"})
def logout(self):
self.client.post("/logout", {"username":"ellen_key", "password":"education"})
@task(2)
def index(self):
self.client.get("/")
@task(1)
def profile(self):
self.client.get("/profile")
class WebsiteUser(HttpLocust):
task_set = UserBehavior
min_wait = 5000
max_wait = 9000
在Locust
类(以及HttpLocust
因为它是一个子类),也可以让一个在指定最小和最大等待时间毫秒,每个模拟用户之间的任务执行(min_wait 和 MAX_WAIT)以及其他用户的行为。
默认情况下,时间是在 min_wait 和 max_wait 之间均匀地随机选择的,但是可以通过将 wait_function 设置为任意函数来使用任何用户定义的时间分布。
例如,对于平均时间为 1 秒的指数分布等待时间:
import random
class WebsiteUser(HttpLocust):
task_set = UserBehaviour
wait_function = lambda self: random.expovariate(1)*1000
启动 Locust
要使用上述 Locust 文件运行 Locust,如果该文件名为locustfile.py
且位于当前工作目录中,则可以运行:
$ locust --host=http://example.com
如果 Locust 文件位于子目录下和 / 或名称不同于 locustfile.py
,请使用-f
以下命令指定它:
$ locust -f locust_files/my_locust_file.py --host=http://example.com
要运行跨多个进程分布的 Locust,我们可以通过指定--master
以下内容启动主进程 :
$ locust -f locust_files/my_locust_file.py --master --host=http://example.com
然后我们将启动任意数量的从属进程:
$ locust -f locust_files/my_locust_file.py --slave --host=http://example.com
如果要在多台计算机上运行 Locust 分布式服务器,则在启动从属服务器时也必须指定主服务器主机(在单台计算机上运行 Locust 时不需要,因为主服务器主机默认为 127.0.0.1):
$ locust -f locust_files/my_locust_file.py --slave --master-host=192.168.0.100 --host=http://example.com
注意:要查看所有可用选项,请输入:
locust --help
打开 Locust 的 Web 界面
使用上述命令行之一启动 Locust 后,应该打开浏览器并输入 http://127.0.0.1:8089
(如果在本地运行 Locust)。
然后,您应该会看到类似以下内容:
另一个性能测试脚本
创建 load_test.py 文件,通过 Python 编写性能测试脚本。
from locust import HttpLocust, TaskSet, task
# 定义用户行为
class UserBehavior(TaskSet):
@task
def baidu_index(self):
self.client.get("/")
class WebsiteUser(HttpLocust):
task_set = UserBehavior
min_wait = 3000
max_wait = 6000
UserBehavior 类继承 TaskSet 类,用于描述用户行为。
baidu_index() 方法表示一个用户为行,访问百度首页。使用 @task 装饰该方法为一个事务。client.get() 用于指请求的路径“/”,因为是百度首页,所以指定为根路径。
WebsiteUser 类用于设置性能测试。
- task_set :指向一个定义的用户行为类。
- min_wait :执行事务之间用户等待时间的下界(单位:毫秒)。
- max_wait :执行事务之间用户等待时间的上界(单位:毫秒)。
启动性能测试
> locust -f .\load_test.py --host=https://www.baidu.com
[2017-10-16 16:44:40,839] DESKTOP-SMGQBBM/INFO/locust.main: Starting web monitor at *:8089
[2017-10-16 16:44:40,842] DESKTOP-SMGQBBM/INFO/locust.main: Starting Locust 0.8
- -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:是每秒钟请求的个数。