PyUnit - Как выполнить модульное тестирование метода, который входит в бесконечный цикл для некоторого ввода?

Сообщение в 2011 году ответило на этот вопрос для NUnit: как выполнить модульное тестирование метода, который входит в бесконечный цикл для некоторого ввода?

Существует ли аналогичный атрибут TimeoutAttribute в PyUnit, который я могу использовать таким же образом?

Я немного искал и нашел "Длительность", но это не похоже на то же самое.

1 ответ

Решение

Похоже, в самом пюните ничего нет, но в качестве обходного пути вы можете кататься самостоятельно. Вот как это сделать, используя многопроцессорный пакет.

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
Другие вопросы по тегам