用模拟时间对周期性协程进行单元测试

时间:2015-11-26 13:56:43

标签: python unit-testing testing asynchronous tornado

我使用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中运行,整个测试策略如何工作?

1 个答案:

答案 0 :(得分:0)

通常,使用yield gen.moment来触发特定事件是很冒险的;无法保证您必须等待多少“时刻”,或者触发事件发生的顺序。最好确保被测试的函数具有一些可以异步等待的效果(如果它自然没有这种效果,你可以使用tornado.locks.Condition)。

修补IOLoop.time还有一些细微之处。我认为它可以使用默认的Tornado IOLoops(在不使用mock的情况下可以使用:在构造循环时传递time_func参数),但是它不具有所需的效果,例如: AsyncIOLoop

我认为您不想使用AsyncTestCase.stop.wait,但不清楚您的测试是如何设置的。