在Python unittests中连接到本地停靠的Perforce服务器

在Python unittests中连接到本地停靠的Perforce服务器,python,docker,pytest,perforce,Python,Docker,Pytest,Perforce,我维护了一个Python工具,该工具针对Perforce服务器运行自动化。出于显而易见的原因,我的测试套件的某些部分(即unittest.TestCase类与Pytest一起运行)需要一个实时服务器。到目前为止,我一直在使用远程测试服务器,但我希望将其转移到本地环境中,并将服务器初始化作为测试前设置的一部分 我正在试验dockerization作为一种解决方案,但在测试代码中尝试对服务器运行Perforce命令时,会出现奇怪的连接错误。以下是我的测试服务器代码(使用自定义docker映像、基于并

我维护了一个Python工具,该工具针对Perforce服务器运行自动化。出于显而易见的原因,我的测试套件的某些部分(即
unittest.TestCase
类与Pytest一起运行)需要一个实时服务器。到目前为止,我一直在使用远程测试服务器,但我希望将其转移到本地环境中,并将服务器初始化作为测试前设置的一部分

我正在试验dockerization作为一种解决方案,但在测试代码中尝试对服务器运行Perforce命令时,会出现奇怪的连接错误。以下是我的测试服务器代码(使用自定义docker映像、基于并安装了P4Python库的单例元类):

下面是我的测试代码:

class TestSystemP4TestServer(unittest.TestCase):
    def test_server_connection(self):
        testserver = P4TestServer()
        with testserver.p4.connect():
            info = testserver.p4.run_info()
        self.assertIsNotNone(info)
这就是我遇到的问题:第一次运行该测试时(即,当它必须启动容器时),它失败并出现以下错误:

E           P4.P4Exception: [P4#run] Errors during command execution( "p4 info" )
E           
E               [Error]: 'TCP receive failed.\nread: socket: Connection reset by peer'
但在随后的运行中,当容器已经运行时,它会通过。令人沮丧的是,我无法以其他方式重现这个错误。如果我在任何其他上下文中运行该测试代码,包括:

  • 在Python解释器中
  • 在一个调试器中,调试器在调用
    testserver.p4.run\u info()
    之前停止
无论容器是否已在运行,代码都会按预期完成


在这一点上,我所能想到的是,pytest环境的某些独特之处让我大吃一惊,但我甚至不知道如何开始诊断。有什么想法吗?

我最近遇到了一个类似的问题,我将启动postgres容器,然后立即运行python脚本,根据我的应用程序要求设置数据库

我不得不在两个步骤之间引入一个sleep命令,这就解决了这个问题


理想情况下,您应该在尝试使用docker容器之前检查它的开始序列是否完成。但对于我的本地开发用例来说,睡眠5秒已经足够好了。

我很惊讶,但这确实有效。这大概意味着容器创建不会在Dockerfile中的
CMD
命令完成时阻塞,对吗?很烦人,但没问题。CMD将在容器的上下文中运行。但是主机没有在上面看到docker命令块。确保容器处于“就绪”状态并具有相应的错误处理(例如,睡眠和稍后重试)始终是容器用户的责任。
E           P4.P4Exception: [P4#run] Errors during command execution( "p4 info" )
E           
E               [Error]: 'TCP receive failed.\nread: socket: Connection reset by peer'