我使用Tornado作为定期进程的协程引擎,其中重复协程在每次执行结束时调用ioloop.call_later()
。我现在试图通过单元测试(使用Tornado' s gen.test)来驱动它,我用一个局部变量来模拟ioloop的时间t:
DUT.ioloop.time = mock.Mock(side_effect= lambda: t)
(DUT< ==>被测设备)
然后在测试中,我手动递增t,并yield gen.moment
启动ioloop。我的想法是在不同的时间间隔后触发重复的协同程序,以便我可以验证它的行为。
但协同程序并不总是触发 - 或者它可能在完成执行之前返回到测试代码,从而导致失败。
我认为应该使用stop()
和wait()
来同步测试代码,但我无法在这种情况下具体了解如何使用它们。如果DUT在自己的ioloop中运行,整个测试策略如何工作?
答案 0 :(得分:0)
通常,使用yield gen.moment
来触发特定事件是很冒险的;无法保证您必须等待多少“时刻”,或者触发事件发生的顺序。最好确保被测试的函数具有一些可以异步等待的效果(如果它自然没有这种效果,你可以使用tornado.locks.Condition
)。
修补IOLoop.time
还有一些细微之处。我认为它可以使用默认的Tornado IOLoops(在不使用mock
的情况下可以使用:在构造循环时传递time_func
参数),但是它不具有所需的效果,例如: AsyncIOLoop
。
我认为您不想使用AsyncTestCase.stop
和.wait
,但不清楚您的测试是如何设置的。