Python异步测试出现RuntimeWarning协程未await问题,求排查方法
定位未被await的协程位置的方法
1. 输出完整警告调用栈
通过Python环境变量让RuntimeWarning输出完整调用链,执行测试时运行:
PYTHONWARNINGS="default::RuntimeWarning:asyncio" pytest your_test_file.py
这会显示警告的完整调用路径,直接指向未被await的协程触发位置,包括mock相关的内部调用。
2. 替换MagicMock为AsyncMock
若用MagicMock模拟异步函数,需换成适配异步场景的AsyncMock(Python 3.8+支持),错误的mock类型会导致调用异步方法时返回未处理的协程对象:
# 替换前 mock1 = MagicMock() # 替换后 from unittest.mock import AsyncMock mock1 = AsyncMock()
如果使用pytest-mock,可以通过mocker.AsyncMock()创建异步mock。
3. 启用asyncio调试模式
asyncio调试模式会主动检测未被await的协程并输出详细追踪信息,两种启用方式:
- 在测试代码开头添加:
import asyncio asyncio.get_event_loop().set_debug(True) - 通过环境变量启动测试:
PYTHONASYNCIODEBUG=1 pytest your_test_file.py
4. 检查mock调用与断言
打印mock的调用记录,确认是否存在未被await的调用:
print(mock1.func.call_args_list)
同时确保mock1.func.assert_awaited_once_with(...)的使用场景正确——只有当mock1.func是被await调用时,这个断言才有效,若直接调用mock1.func()而未加await,就会触发警告。
内容的提问来源于stack exchange,提问作者puf
相关产品推荐
相关产品推荐

