Testing 测试基于异步的服务

Testing 测试基于异步的服务,testing,python-asyncio,Testing,Python Asyncio,我使用asyncio实现小型服务,使用的循环结构如下: pending = {...} while True: done, pending = yield from asyncio.wait( pending, return_when=asyncio.FIRST_COMPLETED, ) for future in done: if future is x: # ... if future is y: # ... 这个循

我使用asyncio实现小型服务,使用的循环结构如下:

pending = {...}
while True:
  done, pending = yield from asyncio.wait( 
    pending, 
    return_when=asyncio.FIRST_COMPLETED, 
  )
  for future in done:
    if future is x:
      # ...
    if future is y:
      # ...
这个循环目前正在控制一个子进程,但在编写了一系列基于ZMQ的服务之后,这种风格感觉非常自然,因此我可能会在不久的将来编写更多这样的服务

我有一些东西可以按我喜欢的方式运行,但是我有点不知所措,不知道如何为此编写自动测试

我想让我的测试启动这个循环,直到它阻塞
asyncio.wait()
,并注入一个特定事件来测试循环对该特定事件的处理。这样,我就可以测试每个可能的事件处理,并知道我按照预期涵盖了所有情况

但是,我在
asyncio
中找不到提供此功能的任何内容。如果我只是从这个协程中
屈服,那么直到协程完成,测试才会解除阻塞

关于如何测试这种特殊的循环有什么想法吗


Edit:好的,所以我使用
socketpair()
通过将
sys.stdout
与写入端打补丁,并将另一端包装在
StreamReader
中,成功地运行了一些东西

当我在没有捕获的情况下运行pytest时,这是可行的,但是只要删除
-s
参数,测试就会死锁


有什么想法吗?

请看@AndrewSvetlov,谢谢,但没有一个答案是有用的。目前,这段代码正在运行一个子进程,并且没有网络接口,因此我的测试不能简单地拥有另一个与要测试的协同路由交换消息的协同路由。我也不能使用
。运行_直到_complete()
,因为我想测试中间状态…请参阅@AndrewSvetlov,谢谢,但是那里的答案都没有帮助。目前,这段代码正在运行一个子进程,并且没有网络接口,因此我的测试不能简单地拥有另一个与要测试的协同路由交换消息的协同路由。我也不能使用
。在\u complete()之前运行\u
,因为我想测试中间状态。。。