gpt4 book ai didi

python - 测试执行 HTTP 请求的 Python 应用

转载 作者:太空宇宙 更新时间:2023-11-03 17:58:42 24 4
gpt4 key购买 nike

对于测试,我使用 pytest,因此如果您建议一些特定于 pytest 的内容,那就太好了。

我有一些使用 requests 的代码图书馆。它所做的基本上是简单的 POST/GET 请求,用于登录、解析数据等。

我当然想在本地测试该代码而不执行任何实际的 HTTP 请求。

一个monkeypatch funcarg 可能是解决方案,但我认为 mock request.get(...)调用或直接pythons的urllib不好,因为,例如,有些函数在内部执行多个 HTTP 请求,所以我不能只是模拟 request.get("anyURL")用一个简单的lambda *args, **kwaargs: """<html>response</html>""" .

不同的 URL 应该返回不同的内容。有时它应该基于 POST/GET 数据。我也不知道怎么会requests.session直接 mock 时的表现。除此之外如何模拟 session 终止?如何模拟连接失败?

所以最终我认为在这里使用猴子补丁是相当困难的。至少我无法编写一个好的模拟函数来考虑一切。另外,如果我选择 mock urllib直接和有一天requests库开始使用不同的东西,我的所有测试都会失败。

所以我认为最好的方法是使用实​​际的 HTTP 服务器,它在测试运行时打开,并且如果可能的话考虑 pytest 的范围等(所以它是一个 funcarg)。在谷歌搜索时我只找到了两个解决方案:

第一个设置 HTTP 服务器并通过特定 URL 提供预定义内容。这绝对对我不起作用,因为正如我提到的,我打算测试的一些函数会执行多个请求,因此所有内部 HTTP requests.get()会得到相同的答案。不好。

据我所知,第二个也有同样的问题。或者至少不明白如何使用它。

第三个选项可能是编写一个基于 Flask 的小型服务,但我想我会遇到一个问题,即我在测试中使用的东西也应该进行测试,这是一个不好的做法。

最佳答案

您可以在第一次调用后取消模拟get

class Requester():
def get(*args):
...

def mock_get(requester, response):
orig_get = requester.get
def return_text_and_unmock(*args, **kwargs):
self.get = orig_get
return response
requester.get = return_text_and_unmock.__get__(requester, Requester)
return requester

关于python - 测试执行 HTTP 请求的 Python 应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28068590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com