我遇到了一个奇怪的问题,我的测试在本地通过了,但是在TravisCI上失败了。 我将从第三方库导入一个类,需要对它的行为进行轻微的更改,因此我将使用unittest.mock。一点一点来。具体来说,我使用了一个对象,它的类属性之一是“连接管理器”,它处理远程地址的GET/POST/PUT。该连接管理器的一个属性是请求。Session对象,这是我需要修补的。 我需要将一个新的HTTPAdapter挂载到请求。创建对象时的会话对象,我喜欢这样做:
class CustomAdapter(HTTPAdapter):
def init_poolmanager(self, connections, maxsize, block=False):
self.poolmanager = PoolManager(
num_pools=connections,
maxsize=maxsize,
block=block,
assert_hostname=False)
def custom_session_function():
session = requests.Session()
session.mount(CustomHttpAdapter())
return session
def my_function():
with patch('somemodule.requests.Session', return_value=custom_session_function()):
return SomeClass()
所有CustomHttpAdapter所做的就是从HTTPAdapter继承并使用assert_hostname=False创建池管理器(这是为了使用带有私有ca的SSL连接) 我有一堆使用SomeClass对象方法的单元测试,这些方法涉及到发送HTTP请求。他们只是在使用请求。会话对象和正在进行的会话。post等等。 示例类方法:
def do_post(self, path, **kwargs):
return self.session.get(
path,
params=kwargs,
headers=self.headers,
timeout=self.timeout,
verify=self.verify)
当我在本地运行它们时,所有这些都通过得很好,但是当我将PR提交给Travis时,当它到达与服务器通信的第一个测试时,作业将失败(该测试在Travis本地的docker容器中运行) 他们总是抱怨在错误超时:
virtualenv/lib/python3.6/http/client.py:266: in _read_status raise RemoteDisconnected("Remote end closed connection without response"`
E http.client.RemoteDisconnected: Remote end closed connection without response
我很困惑,因为这个错误不是很具有描述性。更令人困惑的是,在调试模式下附加到Travis构建,并手动运行刚刚失败的函数似乎工作得很好。有人知道为什么会这样吗?我不确定这是由于我修补这个对象的方式,还是自定义适配器本身。 编辑:附加信息。这个问题看起来或多或少是随机的。在调试构建中,我可以多次运行同一个函数,有时可以,有时不可以。如果我不尝试挂载自定义适配器,测试将一致通过。我更改了poolmanager,允许对每个请求进行多次重试,并且能够让构建通过一次,但这不是一个持久的解决方案,会导致构建的间歇性、随机失败。 更奇怪的是,只是打补丁并返回未修改的请求。与挂载自定义适配器相比,会话对象似乎会产生更多的问题。
def custom_session_function():
return requests.Sesssion()
导致超时发生在第一个请求上,而不是在几个请求之后。 问题来源StackOverflow 地址:/questions/59378621/python-requests-session-times-out-on-travis-but-not-locally
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。