我有一个Python函数,如果传递了错误数据,就会陷入无限循环。我想编写一个单元测试来确认它是否能够优雅地处理错误参数。问题在于,如果它不能检测到错误参数,它将不会返回。
对于这种情况,使用线程编写测试是否可行?
import threading, unittest
import mymodule
class CallSuspectFunctionThread(threading.Thread):
def __init__(self, func, *args):
self.func = func
self.args = args
super(CallSuspectFunctionThread, self).__init__()
def run(self):
self.func(*self.args)
class TestNoInfiniteLoop(unittest.TestCase):
def test_no_infinite_loop(self):
myobj = mymodule.MyObject()
bad_args = (-1,0)
test_thread = CallSuspectFunctionThread(mybj.func_to_test, *bad_args)
test_thread.daemon = True
test_thread.start()
# fail if func doesn't return after 8 seconds
for i in range(32):
test_thread.join(0.25)
if not test_thread.is_alive():
return
self.fail("function doesn't return")
我看到的唯一问题是,如果测试失败,我会被卡在这个额外的线程上,可能会消耗CPU和内存资源,而其余的测试仍在执行。另一方面,我已经修复了代码,这里的回归概率非常小,所以我不知道是否有必要包括这个测试。