2011年の投稿は、NUnitに関するこの質問に答えまし た。ある入力に対して無限ループに陥るメソッドをユニットテストするにはどうすればよいですか?
同じ方法で使用できる同様のTimeoutAttributeがPyUnitにありますか?
検索して「Duration」を見つけましたが、同じではないようです。
2011年の投稿は、NUnitに関するこの質問に答えまし た。ある入力に対して無限ループに陥るメソッドをユニットテストするにはどうすればよいですか?
同じ方法で使用できる同様のTimeoutAttributeがPyUnitにありますか?
検索して「Duration」を見つけましたが、同じではないようです。
pyunit自体には何も含まれていないようですが、回避策として自分でロールすることができます。マルチプロセッシングパッケージを使用してこれを行う方法は次のとおりです。
from functools import wraps
from multiprocessing import Process
class TimeoutError(Exception):
pass
def timeout(seconds=5, error_message="Timeout"):
def decorator(func):
def wrapper(*args, **kwargs):
process = Process(None, func, None, args, kwargs)
process.start()
process.join(seconds)
if process.is_alive():
process.terminate()
raise TimeoutError(error_message)
return wraps(func)(wrapper)
return decorator
使用方法の例を次に示します。
import time
@timeout()
def test_timeout(a, b, c):
time.sleep(1)
@timeout(1)
def test_timeout2():
time.sleep(2)
if __name__ == '__main__':
test_timeout(1, 2, 3)
test_value = False
try:
test_timeout2()
except TimeoutError as e:
test_value = True
assert test_value