Don't fail tests if they've exceeded the timeout

This commit is contained in:
Harshil 2021-04-21 14:29:24 +05:30
parent a54770947f
commit 1d0f982e95
No known key found for this signature in database
GPG key ID: 5AEE5B73890746C5
3 changed files with 43 additions and 1 deletions

View file

@ -13,5 +13,4 @@ pytest==6.2.2
flaky
beautifulsoup4
pytest-timeout
wheel

View file

@ -23,6 +23,8 @@ disable = C0330,R0801,R0913,R0904,R0903,R0902,W0511,C0116,C0115,W0703,R0914,R091
[tool:pytest]
testpaths = tests
markers =
timeout: xfail a test if exceeds the timeout specified.
addopts = --no-success-flaky-report -rsxX
filterwarnings =
error

View file

@ -21,6 +21,7 @@ import functools
import inspect
import os
import re
import threading
from collections import defaultdict
from queue import Queue
from threading import Thread, Event
@ -339,6 +340,46 @@ def timezone(tzinfo):
return tzinfo
timed_out = False
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_call(item):
marker = item.get_closest_marker("timeout") # Check if function has timeout marker
max_time = 10 # Default timeout if timeout arg not specified
if marker:
max_time = marker.args[0] if marker.args else 10 # Get timeout arg
timeout_setup(item, max_time) # Set and start timer
yield # This executes the test function and later the code after this is run.
if marker:
timeout_teardown(item) # Cancel timer if timeout didn't exceed.
if timed_out: # xfail test if exceeded!
pytest.xfail(reason=f"Timeout of {max_time}s exceeded.")
def timeout_setup(item, max_time):
global timed_out
def xfail_test():
global timed_out
timed_out = True
timer = threading.Timer(max_time, xfail_test)
def cancel_timer():
timer.cancel()
timer.join()
item.cancel_timeout = cancel_timer
timer.start()
def timeout_teardown(item):
cancel = getattr(item, "cancel_timeout", None)
if cancel:
cancel()
def expect_bad_request(func, message, reason):
"""
Wrapper for testing bot functions expected to result in an :class:`telegram.error.BadRequest`.