如何用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
相关产品推荐
相关产品推荐

