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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 20:21:05