【发布时间】:2017-02-14 10:26:44
【问题描述】:
我在试用的测试套件中发现一个问题,在我超时之前一切正常。如果测试由于超时而失败,则不会调用 tearDown 函数,从而使反应器不干净,进而导致其余测试失败。我认为应该在超时后调用 tearDown,有谁知道为什么会发生这种情况?
【问题讨论】:
标签: python testing twisted trial
我在试用的测试套件中发现一个问题,在我超时之前一切正常。如果测试由于超时而失败,则不会调用 tearDown 函数,从而使反应器不干净,进而导致其余测试失败。我认为应该在超时后调用 tearDown,有谁知道为什么会发生这种情况?
【问题讨论】:
标签: python testing twisted trial
无论测试中发生什么,都应该调用tearDown() 是正确的。来自the documentation 为tearDown():
即使测试方法引发异常也会调用此方法
但是,有一个问题。来自相同的文档:
只有在 setUp() 成功时才会调用此方法,而不管测试方法的结果如何。
所以听起来你可能在 setUp() 中启动反应器,当它超时时,这会阻止你的 tearDown() 运行 - 这个想法是你试图在 setUp() 中“设置”的任何东西都是没有成功设置,所以你不想尝试拆掉它。但是,除非您提供 setUp 和 tearDown 方法的代码以及任何相关测试的代码,否则很难确定诊断。
【讨论】:
setUp 方法的代码添加到您的问题中?
这很奇怪,因为在我的盒子上,即使发生超时,拆解也会执行。如果反应堆不处于干净状态,测试应该停止运行,除非您使用--unclean-warnings 标志。测试运行器是否会在您超时后停止?你运行的是什么版本的 Python 和 Twisted?
附带说明,如果您需要对特定测试函数运行独特的拆解,有一个非常方便的addCleanup() 回调。如果您需要取消回调、LoopingCall 或 callLater 函数以使反应器不处于脏状态,它会派上用场。 addCleanup 返回一个 Deferred,因此您可以链接执行临时拆卸的回调。如果类拆卸对您不起作用,这可能是一个不错的选择。
PS
我已经习惯于编写“行为良好”的 Twisted 代码,我什至不记得如何进入不干净的反应堆状态:D 我发誓我不是在吹牛。您能否向我简要介绍一下您在做什么,以便我可以测试一下?
【讨论】:
我发现了问题,我会把它放在这里,以防将来对其他人有帮助。
我从已经调用的测试中返回了一个 deferred(例如, deferred.callback 已被调用),但它仍然有一个未完成的回调链。从我在https://github.com/twisted/twisted/blob/twisted-16.5.0/src/twisted/trial/_asynctest.py#L92 的试用代码中可以看到,发生这种情况时反应堆会崩溃,这解释了为什么不调用 tearDown 的原因。对我来说,解决方案是从没有长期存在的回调链的违规测试中返回一个延迟(它的回调本身不返回延迟)。
【讨论】: