PyUnit - Как добавить таймаут для отдельных юнит-тестов
Я использую PyUnit в первый раз. Я хочу, чтобы некоторые тесты выполнялись в течение определенного периода времени. Насколько я вижу, нет встроенного способа сделать это.
Я нашел этот ответ: PyUnit - Как провести модульное тестирование метода, который входит в бесконечный цикл для некоторого ввода?, Однако это решение заставляет PyUnit игнорировать другие неудачные тесты. Вот пример:
import multiprocessing
import unittest
from functools import wraps
import time
def timeout(seconds=5, error_message="Timeout"):
def decorator(func):
def wrapper(*args, **kwargs):
process = multiprocessing.Process(None, func, None, args, kwargs)
process.start()
process.join(seconds)
if process.is_alive():
raise TimeoutError(error_message)
return wraps(func)(wrapper)
return decorator
class MyTestCase(unittest.TestCase):
@timeout(1)
def test_Sleepy(self):
time.sleep(5)
@timeout(1)
def test_Falsy(self):
self.assertTrue(False)
if __name__ == '__main__':
unittest.main()
Когда я запускаю этот тест, исключение для test_Falsy не перехватывается платформой PyUnit, и вывод теста заканчивается на FAILED (errors=1)
(вместо FAILED (errors=2)
как и следовало ожидать).
Как правильно добавить тайм-ауты к отдельным тестам PyUnit?
1 ответ
Предлагаемый подход: 1. Держите тест в главном потоке. 2. Реализуйте время ожидания, используя новый поток, а не процесс. Новый поток ожидает в течение 1 секунды (или любого другого времени ожидания) и затем вызывает thread.interrupt_main
Документацию по потокам см. По https://docs.python.org/2/library/thread.html