开发者社区> 问答> 正文

Python请求在Travis上超时的会话,但不是本地的

我遇到了一个奇怪的问题,我的测试在本地通过了,但是在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

展开
收起
kun坤 2019-12-30 10:18:43 764 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载