Pytest отстаивать время ожидания? - PullRequest
0 голосов
/ 30 января 2020

Есть ли способ утверждать, что тестовый пример Pytest провалился из-за истечения времени ожидания? Я хочу запустить тест на долговечность, который я ожидаю запустить без проблем, пока не встретится время ожидания pytest. Я аннотирую тест с помощью @ pytest.mark.timeout (6000), чтобы переопределить тайм-аут по умолчанию для pytest, а когда встречается 6000-секундный таймаут, тест завершается неудачно с E Failed: Timeout >6000.0s.

Я попытался добавить with pytest.raises(pytest.TimeoutExpired) на мой тест, чтобы поймать возможное время ожидания, но это, похоже, не сработало. Есть ли способ правильно отследить тайм-аут, вызванный pytest?

1 Ответ

1 голос
/ 31 января 2020

К сожалению, плагин pytest-timeout , который предоставляет маркер @pytest.mark.timeout, не предоставляет средства для перехвата времени ожидания (для справки source ).

Вы можете найти больше удачи, используя библиотеку, которая предлагает функцию тайм-аута в качестве менеджера контекста, например, из Thomas Ahle ' answer

import signal

class Timeout:
    def __init__(self, seconds=1, error_message='Timeout'):
        self.seconds = seconds
        self.error_message = error_message
    def handle_timeout(self, signum, frame):
        raise TimeoutError(self.error_message)
    def __enter__(self):
        signal.signal(signal.SIGALRM, self.handle_timeout)
        signal.alarm(self.seconds)
    def __exit__(self, type, value, traceback):
        signal.alarm(0)

def test_it_doesnt_succeed():
    try:
        with Timeout(seconds=6):
            do_the_thing()
    except TimeoutError:
        pass
    else:
        raise AssertionError('Expected the thing to timeout!')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...