我使用Tornado作为一个周期性进程的协程引擎,其中重复的协程在每次执行结束时对自身调用ioloop.call_later()
。我现在试着用单元测试来驱动它(使用Tornado的发电机试验)我用一个局部变量t来模拟ioloop的时间:
DUT.ioloop.time = mock.Mock(side_effect= lambda: t)
(DUT<;==>;被测设备)
然后在测试中,我手动增加t和yield gen.moment
来启动ioloop。这个想法是在不同的时间间隔后触发重复的协同过程,这样我就可以验证它的行为。
但是协程并不总是触发——或者它在完成执行之前返回到测试代码,从而导致失败。
我认为应该使用stop()
和wait()
来同步测试代码,但在这种情况下我看不到具体的使用方法。如果DUT在自己的ioloop中运行,那么整个测试策略是如何工作的呢?你知道吗
一般来说,使用
yield gen.moment
来触发特定事件是不确定的;不能保证您必须等待多少“时刻”,或者触发的事件以什么顺序发生。最好确保被测试的函数有一些可以异步等待的效果(如果它自然没有这种效果,可以使用tornado.locks.Condition
)。你知道吗修补
IOLoop.time
还有一些微妙之处。我认为它可以与默认的Tornado IOLoops一起工作(如果不使用mock
:在构建循环时传递time_func
参数是可能的),但是在使用例如AsyncIOLoop
时,它不会达到预期的效果。你知道吗我认为您不想使用
AsyncTestCase.stop
和.wait
,但不清楚您的测试是如何设置的。你知道吗相关问题 更多 >
编程相关推荐