【问题标题】:Wait for stdout on Popen等待 Popen 上的标准输出
【发布时间】:2017-06-11 17:23:41
【问题描述】:

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

以下构造工作正常:

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)

我想在标准输出上等待:

self.stubby_server = subprocess.Popen(['python', '../../app/StubbyServer.py'], stdout=subprocess.PIPE) time.sleep(1)#

我试过了

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

但是readline() 永远不会完成,尽管我已经在测试输出窗口中看到了输出。

有什么想法可以等待烧瓶应用程序启动而无需使用明确的sleep()

【问题讨论】:

  • 啊,是的。我遇到了这个确切的问题。我的解决方案是实际使用retry,然后我会再次尝试我的电话,直到它在我设置的重试超时时间内工作。最终,我根据引发的异常继续重试。这解决了我的问题。
  • 给你。我实际上在 GitHub 上有它。这应该可以解决问题:github.com/internap/fake-ubersmith/blob/…
  • 使用 .read(1) 读取一个字符,然后将其与之前的字符串连接。如果读取了特殊字符,则在生成器中生成字符串,然后重置您的字符串。
  • @cmdLP 不幸的是read(1) 也没有返回任何内容:(
  • 也许用“and”关键字代替 time.sleep 加入表达式。 self.stubby_server = subp... 和 do_things()

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


【解决方案1】:

使用retry 包,这将有助于解决您的问题。最终,您设置 what 您希望重试,what 您想要重试的异常,并且您可以根据您想要重试的方式设置特定的时序参数。它有很好的记录。

这是我如何在我正在从事的一个项目中解决此问题的示例here

如果链接不起作用,以下是可以帮助您的代码的 sn-p:

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

如您所见,我只是尝试使用requests 使用get 访问我的端点(fargs 是传递给requests.get 的参数,您可以看到它调用back您传递给retry_call 的方法),并基于我期待的RequestException,我会延迟1 秒重试。

最后,“fake-ubersmith”是运行你的服务器的命令,它最终是你的类似命令:'python', '../../app/StubbyServer.py'

【讨论】:

  • 因此,如果我正确理解了您的方法,您会发出一个不属于您测试的请求,直到请求成功并因此知道烧瓶已启动?这也可能对我有用
  • @Altoyyr 没错。这段代码的目标只是确定我的服务已启动并正在运行,并且我可以成功到达端点。然后我可以继续我的测试以达到我想要实际测试的端点。这本身也可以看作是一种测试,以确保您的应用成功启动并可以到达端点。
  • 好的,谢谢,我很确定这对我也有用。我有一个奇怪的场景,但我想我可以做到这一点。很好的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多