In my python code, I am expecting exceptions could possibly be raised after calling method requests.Session.request(), for example these:
requests.exceptions.ConnectTimeoutrequests.exceptions.ReadTimeoutrequests.exceptions.Timeout
When any of these expected exceptions are raised, I handle them appropriately, for example possibly a retry situation.
My question, I am using py.test for unit testing, and I purposely want to inject raising exceptions from specific parts of my code. For example, the function that calls requests.Session.request(), instead of returning a valid requests.Response, it raises a requests.exception.
What I want to make sure that my code successfully handles expected and unexpected exceptions coming from other packages, which include those exceptions from requests.
Maybe... Is there a @decorator that I could add to the aforementioned function to raise exceptions upon request during unit testing?
Suggestions for doing exceptions injections for unit testing? (proper phrasing of my question would be greatly appreciated.)
Thanks for the responses!!!
Here is the entire singleton class that creates requests.Session and calls requests.Session.request():
class MyRequest(metaclass=Singleton): def __init__(self, retry_tries=3, retry_backoff=0.1, retry_codes=None): self.session = requests.session() if retry_codes is None: retry_codes = set(REQUEST_RETRY_HTTP_STATUS_CODES) self.session.mount( 'http', HTTPAdapter( max_retries=Retry( total=retry_tries, backoff_factor=retry_backoff, status_forcelist=retry_codes, ), ), ) def request(self, request_method, request_url, **kwargs): try: return self.session.request(method=request_method, url=request_url, **kwargs) except Exception as ex: log.warning( "Session Request: Failed: {}".format(get_exception_message(ex)), extra={ 'request_method': request_method, 'request_url': request_url } ) raise
requests.Session. Can you create a small example which we can discuss? As small as possible (maybe 5-10 lines). See how to create a minimal reproducible examplerequests.Session.request(). Is this helpful?py.test?