如何修复pytest-asyncio中自定义event_loop fixture的弃用警告?
解决pytest-asyncio弃用警告的方案
问题原因
pytest-asyncio 0.23+版本已禁止重定义event_loop fixture,原来自定义session作用域event_loop的实现方式被弃用,官方推荐通过asyncio标记指定循环作用域或修改事件循环策略来替代。
修改步骤
1. 删除自定义的event_loop fixture
直接移除conftest.py中这段代码:
@pytest.fixture(scope="session") def event_loop(): loop = asyncio.get_event_loop_policy().new_event_loop() yield loop loop.close()
2. 指定事件循环作用域(按需选择)
根据测试需求,选择以下任一方式:
方式一:给单个测试用例指定session级循环
在需要的测试函数上添加标记:
@pytest.mark.asyncio(scope="session") async def test_1(session): stmt = select(Country) result = await session.scalars(stmt) assert list(result.all()) == []
方式二:全局给所有异步测试指定session级循环
在conftest.py中添加以下代码,自动给所有异步测试函数添加session级循环标记:
import asyncio import pytest def pytest_collection_modifyitems(items): for item in items: if asyncio.iscoroutinefunction(item.function): item.add_marker(pytest.mark.asyncio(scope="session"))
方式三:针对session级异步fixture指定循环作用域
如果后续有session级的异步fixture,直接给该fixture添加标记:
@pytest.fixture(scope="session") @pytest.mark.asyncio(scope="session") async def async_db_setup(): # 异步初始化逻辑 yield # 异步清理逻辑
3. 保留现有配置
pyproject.toml中的asyncio_mode = "auto"配置无需修改,这是pytest-asyncio的推荐默认模式,会自动适配异步测试的运行。
验证修改
重新运行测试,弃用警告会消失,原有测试逻辑不受影响。
内容的提问来源于stack exchange,提问作者Альберт Александров
相关产品推荐
相关产品推荐

