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

Другие вопросы по тегам