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

如何用pytest验证Python代码未记录任何堆栈跟踪?

解决方法

1. 检查日志记录的exc_info属性

当调用logging.exception()时,堆栈跟踪数据会被存储在日志记录对象的exc_info属性中——这部分信息不会出现在record_tuples或message字段里。你可以遍历caplog.records,逐一验证每个记录的exc_info是否为None:

import logging

def test_no_stack_traces(caplog):
    # 调用待测试的函数
    your_function_under_test()
    
    # 确保所有日志记录都不包含异常堆栈信息
    for record in caplog.records:
        assert record.exc_info is None, f"发现包含堆栈跟踪的日志: {record.message}"

2. 批量筛选异常日志

如果需要快速统计异常日志数量,也可以通过列表推导式筛选出带有exc_info的记录,再断言其数量为0:

def test_no_exception_logs(caplog):
    your_function_under_test()
    
    # 筛选所有包含异常信息的日志
    exception_logs = [record for record in caplog.records if record.exc_info is not None]
    assert len(exception_logs) == 0, f"共发现{len(exception_logs)}条含堆栈跟踪的日志: {[r.message for r in exception_logs]}"

3. 额外注意事项

  • exc_info的正常状态是None,当存在异常时会是一个包含(异常类型、异常实例、回溯对象)的元组;
  • 即使代码用logging.error(msg, exc_info=True)这种显式传递exc_info的方式输出堆栈,上述检查逻辑依然有效;
  • 默认情况下caplog只会捕获WARNING及以上级别的日志,如果需要检查DEBUG级别的日志,需提前设置级别:caplog.set_level(logging.DEBUG)。

内容的提问来源于stack exchange,提问作者Dawngerpony

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:40:36