PyUnit中 - 如何单元测试运行到某些输入一个无限循环的方法?(PyUnit - How to

2019-07-18 07:19发布

在2011年后回答了NUnit的这个问题: 如何单元测试运行到某些输入一个无限循环的方法?

有没有在PyUnit中类似TimeoutAttribute,我可以以同样的方式使用?

我做了一些搜索,发现“持续时间”,但这似乎并不相同。

Answer 1:

似乎没有存在的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


文章来源: PyUnit - How to unit test a method that runs into an infinite loop for some input?