HttpUser是最常用的用户。它增加了一个客户端属性,用来进行HTTP请求。
from locust import HttpUser, task, between
class MyUser(HttpUser):
wait_time = between(5, 15)
@task(4)
def index(self):
self.client.get("/")
@task(1)
def about(self):
self.client.get("/about/")
client是一个HttpSession的实例。HttpSession是request.Session的一个子类/封装器,
所以它的功能有很好的文档记录,对很多人来说应该是熟悉的。
HttpSession增加的内容主要是将请求结果报告给Locust(成功/失败,响应时间,响应长度,名称
它包含了所有HTTP方法的方法:get, post, put, …
就像request.Session一样,它在请求之间保留了cookies,所以它可以很容易地用于登录网站。
提出一个POST请求,看一下响应,并隐含地重复使用我们得到的任何会话cookie,用于第二个请求
pythoresponse = 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")
HttpSession捕获任何由Session抛出的request.RequestException(由连接错误、超时或类似情况引起),而返回一个status_code设置为0、内容设置为None的假Response对象。
如果HTTP响应代码是OK(<400),则认为请求是成功的,但对响应做一些额外的验证往往是有用的。你可以通过使用catch_response参数、with-statement和对response.failure()的调用将一个请求标记为失败。
catch_response: 捕获response 数据,根据 响应数据,对响应的更进一步验证:
with self.client.get("/", catch_response=True) as response:
if response.text != "Success":
response.failure("Got wrong response")
elif response.elapsed.total_seconds() > 0.5:
response.failure("Request took too long")
你也可以把一个请求标记为成功,即使响应代码是坏的。
with self.client.get("/does_not_exist/", catch_response=True) as response:
if response.status_code == 404:
response.success()
你甚至可以通过抛出一个异常,然后在with-block之外捕获它来避免记录一个请求。或者你可以抛出一个locust异常,就像下面的例子,让Locust来捕捉它。
from locust.exception import RescheduleTask
...
with self.client.get("/does_not_exist/", catch_response=True) as response:
if response.status_code == 404:
raise RescheduleTask()
FastHttpUser提供了一个现成的休息方法,但你也可以自己做。
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'")
对于网站来说,URLs包含某种动态参数的页面是非常常见的。通常情况下,在用户的统计中把这些URL分组是有意义的。这可以通过向HttpSession的不同请求方法传递一个名称参数来实现。
# 这些请求的统计信息将分组为: /blog/?id=[id]
for i in range(10):
self.client.get("/blog?id=%i" % i, name="/blog?id=[id]")
在某些情况下,将参数传入请求函数是不可能的,例如在与包裹着Request会话的库/SDK交互时。
通过设置client.request_name属性,提供了另一种分组请求的方法。
#这些请求的统计信息将分组为: /blog/?id=[id]
self.client.request_name="/blog?id=[id]"
for i in range(10):
self.client.get("/blog?id=%i" % i)
self.client.request_name=None
如果你想用最少的模板来连锁多个分组,你可以使用**client.rename_request()**上下文管理器。
@task
def multiple_groupings_example(self):
# 这些请求的统计信息将分组为: /blog/?id=[id]
with self.client.rename_request("/blog?id=[id]"):
for i in range(10):
self.client.get("/blog?id=%i" % i)
# 这些请求的统计信息将分组为r: /article/?id=[id]
with self.client.rename_request("/article?id=[id]"):
for i in range(10):
self.client.get("/article?id=%i" % i)
使用catch_response并直接访问request_meta,你甚至可以根据响应中的内容重命名请求。
with self.client.get("/", catch_response=True) as resp:
resp.request_meta["name"] = resp.json()["name"]
为了提高性能,我们通过将 requests.Session 的 trust_env 属性设置为 False,
将 requests 配置为不在环境中寻找 HTTP 代理设置。如果你不希望这样,你可以手动设置locust_instance.client.trust_env为True。更多细节,请参考requests.Session的文档。
由于每个HttpUser都会创建新的HttpSession,每个用户实例都有自己的连接池。
这类似于真正的用户与网络服务器的交互方式。
然而,如果你想在所有用户之间共享连接,你可以使用一个单一的池管理器。
要做到这一点,将 pool_manager 类属性设置为 urllib3.PoolManager 的一个实例。
from locust import HttpUser
from urllib3 import PoolManager
class MyUser(HttpUser):
# 所有用户最多只能同时连接10个。
pool_manager = PoolManager(maxsize=10, block=True)
关于更多的配置选项,请参考 urllib3 文档。
更多教程,更多实战案例,请阅读:https://edu.csdn.net/course/detail/38449
更多教程,更多实战案例,请阅读:https://edu.csdn.net/course/detail/38449