
locustfile是Locust性能测试工具的用户脚本,描述了单个用户的行为。
locustfile是个普通的Python模块,如果写作locustfile.py,那么路径切换到文件所在目录,直接执行命令就能运行:
$ locust如果换个名字,那么只能通过-f参数指定文件名运行:
$ locust -f locust_files/my_locust_file.py与一般Python模块不同的是:locustfile必须至少定义一个类,且继承自User类。
User类表示性能测试的模拟用户,Locust会在运行时创建User类的实例。
设置等待时间,默认值不等待,立即执行。
Locust支持4种方式设置wait_time属性。
为了便于理解实际意义,我把源码贴在了下面。
设置创建类实例的权重,默认每个类创建相同数量的实例。
locustfile中可以有多个继承了User类的类。
命令行可以指定运行哪些类: $ locust -f locust_file.py WebUser MobileUser
通过weight属性可以让类更大概率创建实例,比如:
class WebUser(User):
weight = 3
...
class MobileUser(User):
weight = 1
...WebUser类比MobileUser类多三倍概率创建实例。
设置URL前缀。
一般是在Locust的Web UI或者命令行,通过--host指定URL前缀。如果没有通过--host指定,并且类中设置了host属性,那么类的host属性才会生效。
对用户运行环境的引用。
比如在task方法中通过environment属性终止运行:
self.environment.runner.quit()注意,单机会终止所有运行,分布式只会终止单个worker节点。
测试前初始化和测试后清理。
开篇文章的示例脚本,没有继承User类,而是继承了它的子类HttpUser:

它比User类更常用,因为它添加了一个client属性,用来发送HTTP请求。
HttpUser类的client属性是HttpSession类的一个实例:

HttpSession是requests.Session的子类,requests就是常用来做接口测试的那个requests库:

HttpSession没有对requests.Session做什么改动,主要是传递请求结果给Locust,比如success/fail,response time,response length,name。
示例:
response = self.client.post("/login", {"username":"testuser", "password":"secret"})
print("Response status code:", response.status_code)
print("Response text:", response.text)
response = self.client.get("/my-profile")由于requests.Session会暂存cookie,所以示例中登录/login请求后可以继续请求/my-profile。
可以使用with语句和catch_response参数对响应结果进行断言:
with self.client.get("/", catch_response=True) as response:
if response.text == "Success":
response.success()
elif response.text != "Success":
response.failure("Got wrong response")
elif response.elapsed.total_seconds() > 0.5:
response.failure("Request took too long")或者直接抛出异常:
from locust.exception import RescheduleTask
...
with self.client.get("/does_not_exist/", catch_response=True) as response:
if response.status_code == 404:
raise RescheduleTask()name参数用于把不同api按同一分组进行统计,比如:
for i in range(10):
self.client.get("/blog?id=%i" % i, name="/blog?id=[id]")会按/blog/?id=[id]统计1条数据,而不是分成10条数据。
Locust默认设置了requests.Session的trust_env为False,不查找代理,以提高运行性能。如果需要可以设置locust_instance.client.trust_env为True。
请求REST API并断言:
from json import JSONDecodeError
...
with self.client.post("/", json={"foo": 42, "bar": None}, catch_response=True) as response:
try:
if response.json()["greeting"] != "hello":
response.failure("Did not get expected value in greeting")
except JSONDecodeError:
response.failure("Response could not be decoded as JSON")
except KeyError:
response.failure("Response did not contain expected key 'greeting'")locustfile是个普通Python模块,必须继承User类或其子类HttpUser等。本文对User类和HttpUser类的属性和方法进行了介绍,使用它们可以编写性能测试的用户脚本。locustfile还有另外一个重要组成元素,@task。
参考资料: https://docs.locust.io/en/stable/writing-a-locustfile.html https://blog.csdn.net/Orangesir/article/details/114914969