【问题标题】:validating response outside of context manager?在上下文管理器之外验证响应?
【发布时间】:2021-12-31 04:22:08
【问题描述】:

[编辑:阅读回复后我意识到我的问题过于简单化了。]

我是 Locust 的新手,不知道如何解决这个问题。

我有一个函数(称为“get_doc”),它传递了一个 locust.HttpSession() 并使用它来发出一个 HTTP 请求。它获取响应并对其进行解析,然后将其返回多层调用。这些更高级别的调用之一会查看返回的已解析文档,以确定响应是否符合预期。如果没有,我希望 Locust 将请求/响应标记为失败。代码草图是:

class MyUser (HttpUser):
    @task
    def mytask(self):
        behavior1 (self.client)

def bahavior1(session):
    doc = get_doc(session, url1)
    if not doc_ok (doc):
        ??? how to register a failure with Locust here...
    doc2 = get_doc(session, url2)
    ...

def get_doc(http_session, url):
    page = http_session.get(url)
    doc = parse (page)
    return doc

可能有多个行为[n] 函数和多个 Locust 用户调用它们。

一个限制是我希望将特定于 Locust 的内容排除在 bahavior1() 之外,以便我可以使用普通的 Requests 会话来调用它。我曾尝试在 get_doc() 中做类似的事情(catch_response 参数和成功/失败的东西实际上是以 'session' 为 HttpSession 对象的条件):

def get_doc (session, meth, url):
    resp = session.request (meth, url, catch_response=True)
    doc = parse (resp.content)
    doc.logfns = resp.success, resp.failure
    return doc

然后在 behavior1() 或一些更高的上游调用者中我可以

doc.logfns[1]("Document not as expected")

doc.logfns[0]  # Looks good!

不幸的是,这不起作用;对它们的调用不会产生错误,但 Locust 似乎也没有记录任何成功或失败。我不确定它是否应该工作,或者我在我的代码中搞砸了一些东西。这可行吗?有没有更好的办法?

【问题讨论】:

  • 如果你使用 catch_response=True 你必须使用 with 块。否则(如您所见)它什么都不做。
  • 好吧,我害怕那个。我会寻找另一种方法。谢谢。

标签: locust


【解决方案1】:

您可以让 get_doc 成为上下文管理器,使用 catch_response=True 调用 .get 并在其中使用 yield 而不是 return。类似于这里的做法:https://github.com/SvenskaSpel/locust-plugins/blob/2cbbdda9ae37b6cbb0a11cf69aca80b164198aec/locust_plugins/users/rest.py#L22

然后像这样使用它

def mytask(self):
    with get_doc(self.client, url) as doc:
        if not doc_ok(doc):
            doc.failure(”doc was not ok :(”)

如果需要,您可以在 doc 函数中生成之前将解析的文档作为字段添加到响应中,或者在 doc_ok 中调用 doc.failure()。

【讨论】:

  • 我希望有某种方法可以避免使用上下文管理器,但我意识到我并没有弄清楚原因——我已经编辑了原始问题以添加更多细节。我很抱歉第一次没有更清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 2017-04-16
相关资源
最近更新 更多