Fixtures
event_loop
Creates a new asyncio event loop based on the current event loop policy. The new loop
is available as the return value of this fixture for synchronous functions, or via asyncio.get_running_loop for asynchronous functions.
The event loop is closed when the fixture scope ends.
The fixture scope defaults to function
scope.
import asyncio
def test_event_loop_fixture(event_loop):
event_loop.run_until_complete(asyncio.sleep(0))
Note that, when using the event_loop
fixture, you need to interact with the event loop using methods like event_loop.run_until_complete
. If you want to await code inside your test function, you need to write a coroutine and use it as a test function. The asyncio marker
is used to mark coroutines that should be treated as test functions.
If you need to change the type of the event loop, prefer setting a custom event loop policy over redefining the event_loop
fixture.
If the pytest.mark.asyncio
decorator is applied to a test function, the event_loop
fixture will be requested automatically by the test function.
event_loop_policy
Returns the event loop policy used to create asyncio event loops. The default return value is asyncio.get_event_loop_policy().
This fixture can be overridden when a different event loop policy should be used.
import asyncio
import pytest
class CustomEventLoopPolicy(asyncio.DefaultEventLoopPolicy):
pass
@pytest.fixture(scope="module")
def event_loop_policy(request):
return CustomEventLoopPolicy()
@pytest.mark.asyncio(scope="module")
async def test_uses_custom_event_loop_policy():
assert isinstance(asyncio.get_event_loop_policy(), CustomEventLoopPolicy)
Multiple policies can be provided via fixture parameters. The fixture is automatically applied to all pytest-asyncio tests. Therefore, all tests managed by pytest-asyncio are run once for each fixture parameter. The following example runs the test with different event loop policies.
import asyncio
from asyncio import DefaultEventLoopPolicy
import pytest
class CustomEventLoopPolicy(asyncio.DefaultEventLoopPolicy):
pass
@pytest.fixture(
params=(
DefaultEventLoopPolicy(),
CustomEventLoopPolicy(),
),
)
def event_loop_policy(request):
return request.param
@pytest.mark.asyncio
async def test_uses_custom_event_loop_policy():
assert isinstance(asyncio.get_event_loop_policy(), DefaultEventLoopPolicy)
unused_tcp_port
Finds and yields a single unused TCP port on the localhost interface. Useful for binding temporary test servers.
unused_tcp_port_factory
A callable which returns a different unused TCP port each invocation. Useful when several unused TCP ports are required in a test.
def a_test(unused_tcp_port_factory):
port1, port2 = unused_tcp_port_factory(), unused_tcp_port_factory()
...
unused_udp_port and unused_udp_port_factory
Works just like their TCP counterparts but returns unused UDP ports.