You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Question: how to set fixture and async function same loop? #983
That way all the tests run on the same loop as the fixtures (I have session-scoped db fixture that runs migrations, and a function scoped db fixture that wraps everything in a transaction; so I needed everything to run on the same loop).
defpytest_collection_modifyitems(items: Any) ->None:
""" Make all tests run on the same event loop. This is necessary because our db session is created on the event loop, and we need to ensure all tests run on the same event loop as the db! See: https://pytest-asyncio.readthedocs.io/en/latest/how-to-guides/run_session_tests_in_same_loop.html """pytest_asyncio_tests= (itemforiteminitemsifis_async_test(item))
session_scope_marker=pytest.mark.asyncio(loop_scope="session")
forasync_testinpytest_asyncio_tests:
async_test.add_marker(session_scope_marker, append=False)
@pytest.fixture(scope="session", autouse=True)asyncdefprepare_testsuite_db() ->AsyncIterator[None]:
"""Set up test database and engine."""engine=create_async_engine(get_database_url())
asyncwithengine.begin() asconn:
awaitconn.run_sync(Base.metadata.drop_all)
awaitconn.run_sync(Base.metadata.create_all)
awaitconn.commit()
yield# Then the func scope db fixtures providing a transaction for each test
The testsuite is just as fast as before, no errors at all. Only thing lacking is being able to configure the loop scope of tests in pyproject.toml instead of having to do tricks with pytest hooks. But I think there was an open issue about this and the lib maintainer is fully aware. For now this is sufficient for me.
Thank you, @scastlara! I agree that the hook is not an ideal solution, but just to be thorough, I ran a small benchmark. For a test suite consisting of 1,100 synchronous and 820 asynchronous tests, it takes less than a millisecond. So that's a good enough solution 🎉
Activity
Provinm commentedon Nov 11, 2024
solved, thx!
scastlara commentedon Nov 13, 2024
How did you solve it?
EDIT: For me it was adding this to
pyproject.tomlAnd following the docs and adding this to
conftest.py: https://pytest-asyncio.readthedocs.io/en/latest/how-to-guides/run_session_tests_in_same_loop.htmlThat way all the tests run on the same loop as the fixtures (I have session-scoped db fixture that runs migrations, and a function scoped db fixture that wraps everything in a transaction; so I needed everything to run on the same loop).
Provinm commentedon Nov 18, 2024
@scastlara
change
to
this makes
loop1==lop2nekeal commentedon Nov 20, 2024
@scastlara, have you encountered any issues with this approach? I have a similar case:
asyncio_default_fixture_loop_scope = "session"I'm curious if the approach you mentioned is the best way to handle this, or if there might be a better alternative.
scastlara commentedon Nov 20, 2024
Hey @nekeal ! No problems at all.
pyproject.tomlconftest.pyThe testsuite is just as fast as before, no errors at all. Only thing lacking is being able to configure the loop scope of tests in pyproject.toml instead of having to do tricks with pytest hooks. But I think there was an open issue about this and the lib maintainer is fully aware. For now this is sufficient for me.
nekeal commentedon Nov 20, 2024
Thank you, @scastlara! I agree that the hook is not an ideal solution, but just to be thorough, I ran a small benchmark. For a test suite consisting of 1,100 synchronous and 820 asynchronous tests, it takes less than a millisecond. So that's a good enough solution 🎉
seifertm commentedon Dec 6, 2024
#793 aims to add a configuration option for the default loop scope of tests in favour of the hook.
Hence, I'll convert this to a discussion :)