在Popen等待stdout

时间:2017-06-11 17:23:41

标签: python python-3.x testing flask python-3.6

我正在尝试为烧瓶应用程序设置验收测试工具,我正在努力等待应用程序在拨打电话之前启动。

以下构造工作正常:

class SpinUpTests(unittest.TestCase):
def tearDown(self):
    super().tearDown()
    self.stubby_server.kill()
    self.stubby_server.communicate()

def test_given_not_yet_running_when_created_without_config_then_started_on_default_port(self):
    self.not_yet_running(5000)

    self.stubby_server = subprocess.Popen(['python', '../../app/StubbyServer.py'], stdout=subprocess.PIPE)
    time.sleep(1)#<--- I would like to get rid of this

    self.then_started_on_port(5000)

我想在stdout上等待:

self.stubby_server = subprocess.Popen([&#39; python&#39;,&#39; ../../ app / StubbyServer.py&#39;],stdout = subprocess.PIPE)         time.sleep(1)#&lt; ---我想摆脱这个

  

我试过

for line in self.stubby_server.stdout.readline()

但是readline()永远不会结束,所以我已经在测试输出窗口中看到了输出。

我是否可以等待烧瓶应用程序启动而无需使用明确的sleep()

1 个答案:

答案 0 :(得分:1)

使用retry包,这有助于解决您的问题。最后,您设置您想要再次尝试的您想要重试的异常,并且您可以根据您想要重试的方式设置特定的时序参数。它记录得非常好。

以下是我在here

工作的其中一个项目中解决此问题的示例

以下是可以帮助您的代码片段,以防链接不起作用:

@classmethod
def _start_app_locally(cls):
    subprocess.Popen(["fake-ubersmith"])
    retry_call(
        requests.get,
        fargs=["{}/status".format(cls.endpoint)],
        exceptions=RequestException,
        delay=1
    )

正如您所看到的,我只是尝试使用get使用requests来点击我的端点(fargs是传递给requests.get的参数,因为您可以看到它调用返回传递给retry_call的方法,并根据我期待的RequestException,我会以1秒的延迟重试。

最后,&#34;假 - 超级匠&#34;是运行服务器的命令,最终是您的命令:'python', '../../app/StubbyServer.py'