pytest-dev / pytest-dev/pytest-asyncio
set a default loop exception_handler that warns (similar to -p unraisablehook)
Open
Nobody has claimed this yet.
feature
- Dominant language
- Python
- Stars
- 1.7k
- Forks
- 207
- Avg merge
- 5h 35m
- Merged PRs (30d)
- 9
Description
consider the following test:
import pytest
import asyncio
@pytest.mark.asyncio
async def test_foo():
def raise_():
raise Exception
asyncio.get_running_loop().call_soon(raise_)
await asyncio.sleep(0)
it passes cleanly.
However if you explicitly collect any errors:
import pytest
import asyncio
@pytest.mark.asyncio
async def test_foo():
loop = asyncio.get_running_loop()
old_exception_handler = loop.get_exception_handler()
exceptions = []
def exception_handler(*args, **kwargs):
exceptions.append((args, kwargs))
loop.set_exception_handler(exception_handler)
try:
def raise_():
raise Exception
asyncio.get_running_loop().call_soon(raise_)
await asyncio.sleep(0)
assert exceptions == []
finally:
loop.set_exception_handler(old_exception_handler)
=================================== test session starts ====================================
platform linux -- Python 3.9.2, pytest-6.2.2, py-1.10.0, pluggy-0.13.1
rootdir: /home/graingert/projects/anyio, configfile: pyproject.toml
plugins: hypothesis-6.2.0, asyncio-0.14.0, anyio-2.1.0.post21+dirty
collected 1 item
ham.py F [100%]
========================================= FAILURES =========================================
_________________________________________ test_foo _________________________________________
ham.py:20: in test_foo
assert exceptions == []
E AssertionError: assert [((<_UnixSele...py:15'}), {})] == []
E Left contains one more item: ((<_UnixSelectorEventLoop running=True closed=False debug=False>, {'exception': Exception(), 'handle': <Handle test_fo...y:15>, 'message': 'Exception in callback test_foo.<locals>.raise_() at /home/graingert/projects/anyio/ham.py:15'}), {})
E Use -v to get the full diff
==================================== 1 failed in 0.04s ====================================
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by running the supplied pytest.mark.asyncio reproducer and trace where the plugin configures the running asyncio event loop. Determine how a default exception handler should warn for the unhandled callback exception, then verify the test no longer passes silently while an explicitly installed handler can still collect the exception.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- testing-qa
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 42/100