gpt4 book ai didi

python - 测试 urllib2 应用程序,从文件加载的 http 响应

转载 作者:行者123 更新时间:2023-11-30 23:58:06 25 4
gpt4 key购买 nike

我的 python 应用程序使用 urllib2 向许多 url 发出许多 http 请求。我想构建一个单元测试套件来测试我的数据解析和错误处理代码。

我有一个充满测试数据的目录,其中有许多文件,每个文件包含一个http响应,带有 header 和响应数据。 (使用curl -i)在某些情况下,这些文件包含http错误消息(需要测试错误处理)

理想情况下,我想创建一个模拟对象来替换 urllib2.urlopen 并返回一个模拟响应对象。

我想知道是否有一种简单的方法可以让 urllib2 直接从文件加载 HTTP 响应,并让 urllib2 解析此数据以创建适当的响应对象(就像从 url 读取响应一样)。

我尝试使用使用“file://”协议(protocol)构造的 url,但是文件顶部的 http 响应 header 未正确读取或解析。

或者,我正在考虑编写一个小型 Web 服务器类来提供测试文件,但这似乎比我想要的要多一些。让 urllib2 以某种方式从我已经保存在文件中的 http 响应重建响应对象会更容易(无需构建一个 Web 服务器来再次为它们提供服务)

有什么想法吗?

最佳答案

我认为最好的方法是模拟 httplib.HTTPConnection 的子集(为了具体起见,请调用生成的类 mockcon )并使用它添加一个处理程序并子类化 HTTPHandler (在 build_opener 中使用——子类化意味着它可以替换 HTTPHandler 默认使用的 build_opener):

class MockHTTPHandler(urllib2.HTTPHandler):

def http_open(self, req):
return self.do_open(mockcon, req)

mockcon 类必须提供方法 do_open调用——有几个可以是假的(即接受并忽略任意参数和 kwds 并且不执行任何操作):

set_debuglevel
_set_tunnel
request

(可能对 request 的第二个参数感兴趣,因为它给出了 URL 的“选择器”部分)。

__init__方法mockcon获取 URL 的主机部分作为第一个参数(即,当然是 self 之后的第一个参数),并且应该忽略后面的 kwds(用于设置超时)。

get_response方法mockcon (没有参数,当然除了 self )必须返回一个http响应对象——即一个类似文件的可读对象,它也具有属性 .msg , .status ,和.reason ,以及方法 get_full_url()返回 URL。

您可以使用实际的 httplib.HTTPResponse后一个角色的实例,但您必须使用一个具有 makefile 的模拟/虚拟参数来初始化它。参数(忽略它的 args 和 kwds 并返回任何内容),并且在初始化它之后立即重置它的 .fp参数是 rb打开的文件准确给出了真实 HTTP 响应将在其套接字上接收的字节。

我认为为整体构建一个成熟的模拟 urllib2.urlopen调用可能比重用urllib2的大部分功能的尝试更简单。 (以及它内部使用的httplib),尽管可能不像您认为需要更多工作的“本地网络服务器”方法那么简单。但这三种方法都值得考虑(模拟肯定是最轻量/运行速度最快的,本地 Web 服务器最慢......当然,还需要通过在 URL 前面添加 http://localhost:someport/ 来修改 URL) .

关于python - 测试 urllib2 应用程序,从文件加载的 http 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3278418/

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