我需要用python模拟docker服务器进行单元测试

2024-10-03 21:32:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我开发了一个使用docker库的类

self.client = docker.from_env(timeout=5, version="auto")

例如:

def run_container_in_background(self,application,branch,name_container,mount_dir):
    container =self.client.containers.run(image,command"bash",detach=True,name=name_container)

我需要对这个方法进行单元测试,所以我需要模拟docker服务器。那么,有没有人知道如何使用python来模拟它呢

当我试图模拟“self.client=docker.from_env(timeout=5,version=“auto”)”

自我=<;0x0EE644D0处的docker.api.client.APIClient对象>

def _retrieve_server_version(self):
    try:
        return self.version(api_version=False)["ApiVersion"]
    except KeyError:
        raise DockerException(
            'Invalid response from docker daemon: key "ApiVersion"'
            ' is missing.'
        )
    except Exception as e:
        raise DockerException('Error while fetching server API version: 
{0}'.format(e))
E           docker.errors.DockerException: Error while fetching server API version: (2, 'CreateFile', 'Le fichier spécifié est introuvable.')

PS:docker守护进程被停用,以重现我想要解决的相同问题。 有没有办法解决模拟问题来解决这个问题


Tags: dockerrunnamefromselfenvclientapi
1条回答
网友
1楼 · 发布于 2024-10-03 21:32:45

您可能应该重构此类,将Docker客户端作为参数,而不是创建自己的类。除了支持此测试设置外,这还将帮助您执行诸如在对象之间共享连接池之类的操作,并避免重复超时之类的某些细节

class ObjectUnderTest:
  def __init__(self, client):
    self.client = client

  def run_container_in_background(self, application, branch, name_container, mount_dir):
    self.client...

def main():
  client = docker.from_env(timeout=5)
  obj = ObjectUnderTest(client)

完成此操作后,可以创建所需的任何对象,并将其作为client参数传入。特别是因为Python通常是动态类型的,所以您可以使用模拟对象代替真实的客户端,只要您创建的对象具有与调用代码所期望的相同的“形状”

class MockContainer:
  '''A fake Docker API container object.'''
  def __init__(self, *args, **kwargs):
    self.args = args
    self.kwargs = kwargs

class MockContainersApi:
  '''A fake Docker API with containers calls.'''
  def run(self, *args, **kwargs):
    return MockContainer(*args, **kwargs)

class MockDockerApi:
  '''A fake Docker API.'''
  def __init__(self):
    self.containers = MockContainersApi()

def test_run_container():
  client = MockDockerApi()
  obj = ObjectUnderTest(client)
  container = obj.run_container_in_background(...)
  assert container.kwargs['detach'] == True

(也考虑你的应用程序需要EME>直接调用DOCKER API,如果它可以被重构以使用其他技术。正如你在这个问题中所指出的,DOCKER API是复杂的,所需的测试方法并不简单。因为你可以将任意的主机目录绑定到一个容器中,这也是很容易得到的。以root用户身份运行的容器,可以写入主机的/etc目录,从而成为整个主机的root用户。)

相关问题 更多 >