You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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,提问作者Альберт Александров

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 21:08:20