我第一次使用PyUnit。我想要在指定的时间内运行一些测试。据我所见,没有内置的方法可以做到这一点。
我找到了这个答案:PyUnit - How to unit test a method that runs into an infinite loop for some input?。但是,此解决方案会导致PyUnit忽略其他失败的测试。这是一个例子:
import multiprocessing
import unittest
from functools import wraps
import time
def timeout(seconds=5, error_message="Timeout"):
def decorator(func):
def wrapper(*args, **kwargs):
process = multiprocessing.Process(None, func, None, args, kwargs)
process.start()
process.join(seconds)
if process.is_alive():
raise TimeoutError(error_message)
return wraps(func)(wrapper)
return decorator
class MyTestCase(unittest.TestCase):
@timeout(1)
def test_Sleepy(self):
time.sleep(5)
@timeout(1)
def test_Falsy(self):
self.assertTrue(False)
if __name__ == '__main__':
unittest.main()
当我运行此测试时,PyUnit框架不会捕获test_Falsy的异常,并且测试输出以FAILED (errors=1)
结束(而不是您期望的FAILED (errors=2)
)。
为各个PyUnit测试添加超时的正确方法是什么?