如何在pytest中定义异步fixture并用于异步测试?代码执行失败
解决pytest异步fixture的调用问题
你猜的完全没错!问题确实出在pytest默认不会自动await异步fixture上——直接调用的话,你拿到的只是一个协程对象,根本不是fixture实际要返回的api_client和x_id,这自然会导致测试执行失败。
要解决这个问题,你需要借助pytest-asyncio插件来让pytest支持异步fixture和异步测试,具体步骤如下:
1. 安装pytest-asyncio插件
首先通过pip安装这个必要的插件:
pip install pytest-asyncio
2. 修改异步fixture的装饰器
把普通的@pytest.fixture替换成pytest-asyncio提供的@pytest_asyncio.fixture,这样pytest就会自动处理fixture中的异步逻辑,帮你完成await操作:
import pytest_asyncio # 假设你已经导入了api_client、add_x、web这些依赖 @pytest_asyncio.fixture async def create_x(api_client): x_id = await add_x(api_client) return api_client, x_id async def test_app(create_x, auth): api_client, x_id = create_x # 现在pytest会自动await异步fixture,拿到实际返回值 resp = await api_client.get(f'my_res/{x_id}', headers=auth) assert resp.status == web.HTTPOk.status_code
额外注意事项
- 确保你的异步测试函数是用
async def定义的,pytest-asyncio会自动创建事件循环来运行这些测试 - 如果你的
api_client本身也是异步fixture,同样需要用@pytest_asyncio.fixture装饰它 - 如果插件没有自动启用,可以在项目根目录的
pytest.ini中添加配置:[pytest] addopts = -p pytest_asyncio
内容的提问来源于stack exchange,提问作者Pynchia
相关产品推荐
相关产品推荐

