-
Notifications
You must be signed in to change notification settings - Fork 152
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
documentation on how to force all tests in one session to use the same event loop appears to not force fixtures into the same event loop #744
Comments
This is definitely related to #706, #705, and #718, but I think my essential ask here is for documentation on how to ensure a particular test (or scope of tests, or group of tests) uses the same event loop as a particular fixture (or scope of fixtures, or group of fixtures). The example I gave above may seem contrived, but it's essential to the correct functioning of If I have any non-default scoped fixture that creates a client session (possibly multiple layers down from the object I'm actually allocating), that fixture will yield a (nondeterministically) broken client session. |
…op (#14097) Fixes #14130. We pervasively assume: 1. That our entire system is used within a single Python thread. 2. That once an event loop is created that's the only event loop that will exist forever. Pytest (and newer version of IPython, afaict) violate this pretty liberally. ~~pytest_asyncio has [explicit instructions on how to run every test in the same event loop](https://pytest-asyncio.readthedocs.io/en/latest/how-to-guides/run_session_tests_in_same_loop.html). I've implemented those here.~~ [These instructions don't work](pytest-dev/pytest-asyncio#744). It seems that the reliable way to ensure we're using one event loop everywhere is to use pytest-asyncio < 0.23 and to define an event_loop fixture with scope `'session'`. I also switched test_batch.py into pytest-only style. This allows me to use session-scoped fixtures so that they exist exactly once for the entire test suite execution. Also: - `RouterAsyncFS` methods must either be a static method or an async method. We must not create an FS in a sync method. Both `parse_url` and `copy_part_size` now both do not allocate an FS. - `httpx.py` now eagerly errors if the running event loop in `request` differs from that at allocation time. Annoying but much better error message than this nonsense about timeout context managers. - `hail_event_loop` either gets the current thread's event loop (running or not, doesn't matter to us) or creates a fresh event loop and sets it as the current thread's event loop. The previous code didn't guarantee we'd get an event loop b/c `get_event_loop` fails if `set_event_loop` was previously called. - `conftest.py` is inherited downward, so I lifted fixtures out of test_copy.py and friends and into a common `hailtop/conftest.py` - I added `make -C hail pytest-inter-cloud` for testing the inter cloud directory. You still need appropriate permissions and authn. - I removed extraneous pytest.mark.asyncio since we use auto mode everywhere. - `FailureInjectingClientSession` creates an `aiohttp.ClientSession` and therefore must be used while an event loop is running. Easiest fix was to make the test async.
You'd better move to prior version. -> 0.21.1. |
I agree. If pytest-asyncio v0.23 is currently causing issues for you, I suggest to continue using v0.21 until the issues are resolved. @danking The v0.23 release allows tests to be run in different event loops. There's essentially one loop for each hierarchy level of the test suite (session, package, module, class, function). Unfortunately, pytest-asyncio also assumes that the scope of a fixture is coupled with the scope of the event loop. This means that a session-scoped fixture always runs in the session-scope loop. There's currently no way to have a session-scoped fixture running in the same loop as a function-scoped test. This is the core issue of #706. @rumbarum I'm sorry that this caused you spending so much time on this issue. |
@seifertm |
I can reproduce the error of the OP. However, when changing the line The @danking I hope this addresses your issue, otherwise feel free to comment and we can revisit this. |
I checked in all the files referenced below into this repo: https://github.com/danking/pytest-asyncio-confusion
Simple test file:
conftest.py taken directly from the docs:
pytest.ini:
I expected this to pass but instead it fails:
Am I being dense? I feel like I must misunderstand something very simple. If I explicitly request session scope it works:
The text was updated successfully, but these errors were encountered: