五、Locust之HTTP用户类

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/")

1. 客户端属性/HttpSession

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对象。

2. 验证响应

如果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()

3. REST/JSON APIs

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'")

4. 分组请求

对于网站来说,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"]

5. HTTP 代理设置

为了提高性能,我们通过将 requests.Session 的 trust_env 属性设置为 False
将 requests 配置为不在环境中寻找 HTTP 代理设置。如果你不希望这样,你可以手动设置locust_instance.client.trust_env为True。更多细节,请参考requests.Session的文档。

6. 连接池

由于每个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
五、Locust之HTTP用户类_第1张图片

更多教程,更多实战案例,请阅读:https://edu.csdn.net/course/detail/38449

你可能感兴趣的:(http,python,java)