在扭曲的试验中超时后没有调用tearDown?

时间:2016-10-05 20:24:45

标签: python testing twisted trial

我在试用版的测试套件中看到一个问题,一切正常,直到我超时。如果测试由于超时而失败,则tearDown函数永远不会被调用,从而使反应器不清洁,从而导致其余测试失败。我相信应该在超时后调用tearDown,有人知道为什么会发生这种情况吗?

3 个答案:

答案 0 :(得分:1)

无论您的测试中发生什么,都应该调用tearDown()。来自tearDown()的{​​{1}}:

  

即使测试方法引发异常

,也会调用此方法

然而,有一个问题。来自相同的文档:

  

只有在setUp()成功时才会调用此方法,而不管测试方法的结果如何。

所以听起来你可能会在setUp()中启动反应堆,当它超时时,这会阻止你的tearDown()运行 - 这个想法是你想要“设置”的任何东西setUp() 已成功设置,因此您不想尝试将其删除。但是,除非您提供setUptearDown方法的代码以及任何相关测试的代码,否则很难确定地进行诊断。

答案 1 :(得分:1)

这很奇怪,因为在我的盒子上,即使发生超时,也会执行拆解。除非您使用--unclean-warnings标志,否则如果反应堆未处于干净状态,测试应停止运行。测试运行器是否在超时后停止?您运行的是什么版本的Python和Twisted?

作为旁注,如果您需要为特定测试功能运行唯一的拆解,那么这是一个非常方便的addCleanup()回调。如果您需要取消回调,LoopingCall或callLater函数以使反应器不处于脏状态,它会派上用场。 addCleanup会返回Deferred,因此您可以链接执行特殊拆解的回调。如果班级拆解不适合你,可能是一个不错的选择。

PS

我已经习惯了写作"表现良好"扭曲的代码,我甚至不记得如何进入一个不洁净的反应堆状态:D我发誓我不吹牛。你能否简要总结一下你所做的事情,以便我能在我的结果中进行测试?

答案 2 :(得分:0)

我发现了问题,我会把它放在这里以防万一它对将来的其他人有帮助。

我从已经被调用的测试中返回延迟(例如,调用了deferred.callback),但它仍然有一个未完成的回调链。从我在试验代码https://github.com/twisted/twisted/blob/twisted-16.5.0/src/twisted/trial/_asynctest.py#L92中看到的情况来看,反应堆在发生这种情况时会崩溃,这就解释了为什么不会调用tearDown。对我来说,解决方案是返回一个延迟测试,这个测试没有一个长期存在的回调链(它的回调本身不会返回延迟)。