如何让pytest的caplog fixture不记录指定日志且无需重写原有测试
解决方案
完全可以通过封装caplog fixture实现需求,不需要修改任何原有测试代码,有两种常用方案可选:
方案1:封装caplog fixture实现日志过滤(更推荐)
该方案仅过滤caplog捕获的日志,不会影响测试过程中控制台、文件等其他渠道的日志输出。
- 在项目根目录的
conftest.py中添加如下代码:
import pytest from _pytest.logging import LogCaptureFixture # 自定义过滤规则,根据实际要排除的日志属性修改匹配条件 def skip_target_log(record): # 示例:匹配logger名为your.module.logger、级别INFO、消息包含指定内容的日志 if ( record.name == "your.module.logger" and record.levelname == "INFO" and "你新增的日志内容关键词" in record.getMessage() ): return False return True @pytest.fixture(autouse=True) def caplog(caplog: LogCaptureFixture): # 给caplog处理器添加过滤规则 caplog.handler.addFilter(skip_target_log) yield caplog # 测试结束后移除过滤器,避免副作用 caplog.handler.removeFilter(skip_target_log)
- 配置完成后所有原有测试的
caplog.records会自动剔除指定日志,原有直接按下标取日志的代码不需要做任何修改。
方案2:直接过滤目标logger的输出
如果需要彻底屏蔽这条日志在测试环境的所有输出,可以直接给对应logger加过滤规则,在conftest.py中添加如下代码即可:
import logging def skip_target_log(record): # 过滤规则和方案1一致 if ( record.name == "your.module.logger" and record.levelname == "INFO" and "你新增的日志内容关键词" in record.getMessage() ): return False return True def pytest_sessionstart(session): # 给目标logger全局添加过滤器 target_logger = logging.getLogger("your.module.logger") target_logger.addFilter(skip_target_log)
如果后续需要针对这条新增日志编写测试,只要在对应测试用例中临时移除过滤器即可,不会影响新测试的编写。
内容的提问来源于stack exchange,提问作者man zet
相关产品推荐
相关产品推荐

