测试超时问题在使用nosetests时的解决方法

12

我正在设置我的nosetests环境,但好像无法正确地使超时功能发挥作用。我想在nose发现的每个测试中都设置一个x秒(比如2秒)的超时时间。

我尝试了以下方法:

nosetests --processes=-1 --process-timeout=2

这个方案很好,但我注意到以下几点:

  • 对于一些简单的测试用例,并行测试需要更长时间
  • Nose在测试超时(因此失败)时不会报告回来

有人知道如何使超时功能正常工作吗?我希望它可以在没有并行测试的情况下工作,但只要我能得到测试超时的反馈,这不是问题。

1个回答

11

我不知道这是否会让你的生活更轻松,但是在nose.tools中有类似的功能,它会在超时时失败,并且你不需要进行并行测试:

from nose.tools import timed

@timed(2)
def test_a():
    sleep(3)

如果手动添加属性有问题,您可以使用脚本/插件来自动装饰模块中的所有测试,但我个人更喜欢清晰明了而不是神奇。

通过查看 Lib/site-packages/nose/plugins/multiprocess.py 源代码,看起来您正在使用的process-timeout选项是针对管理可能会阻止测试完成的“挂起”子进程而设计的。


3
没问题,按预期工作,谢谢!虽然我希望有一个命令行选项来为所有测试脚本设置超时时间,但我会继续使用这种方法。实际上,这将允许我为一些需要比其他函数运行时间更长的特定函数设置超时时间。 - JustMe
9
我尝试过这个方法,但并不满意。以下是我在代码中加入的内容:import nose.tools.timed # 警告:这个模块不能如广告所述限制测试运行时间,请勿使用该模块,此处仅作警示

nose.tools.timed 模块无法限制测试运行时间,它只是运行测试,如果测试用时超过了规定时间,

则会引发 TimeExpired() 异常,这既没有约束测试运行时间的上限,也没有一种方式可以延长运行时间。

那么为什么会有人使用它呢?

- Jim
@Jim,我发现nose.tools.timed非常有用,可以检查S3网络重试策略所需的时间是否与其所说的一样长。测试应该需要例如0.8秒,如果超过1秒,就会失败。通常很难限制测试运行的时间,因为必须通过操作系统机制强制停止进程。另一方面,nose.tools.timed函数对于非常具体的用例而言是简单且有用的。它让我想起了pytest-timeout软件包的免责声明(它实现了你想要的功能):“这不是你要找的超时时间!” - llude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接