我正在尝试使用此问题作为模板为unittest类创建超时包装器: PyUnit - How to unit test a method that runs into an infinite loop for some input?
如果从Main运行,上述解决方案效果很好,但是我试图通过使用unittest类创建类似的超时,但是失败。
PicklingError:无法腌制:未作为TimeTest.test1
找到我愿意接受任何其他与平台无关并且可以与本机2.7库一起使用的解决方案
这是代码
import unittest
import multiprocessing as mp
import functools as ft
import time
def timeout(seconds=5, error_message="Timeout"):
def decorator(func):
def wrapper(*args, **kwargs):
process = mp.Process(None, func, None, args, kwargs)
process.start()
process.join(seconds)
if process.is_alive():
process.terminate()
raise mp.TimeoutError(error_message)
return ft.wraps(func)(wrapper)
return decorator
class TestCases(unittest.TestCase):
def setUp(self):
self.a = 0
@timeout(1)
def test1(self):
time.sleep(2)
self.assertEquals(self.a, 0)
答案 0 :(得分:0)
我最终放弃了包装器的想法,并创建了一个简单的函数并进行断言。
import unittest
import multiprocessing as mp
import time
TIME_LIMIT = 1
class TestCases(unittest.TestCase):
def setUp(self):
self.a = 0
def my_func(self):
time.sleep(2)
self.q.put(self.a + 1)
def run_case(self, func):
self.q = mp.Queue()
test_process = mp.Process(target=func)
test_process.start()
test_process.join(TIME_LIMIT)
self.assertFalse(test_process.is_alive(), 'timeout exceeded')
def test_case1(self):
self.run_case(self.my_func)
self.assertEquals(self.a + 1, self.q.get())