logging.info无法在终端打印,pytest自动fixture关联问题求助
我的pytest.ini配置如下:
[pytest] log_cli=True log_cli_level=INFO ......
conftest.py中定义了两个fixture:
@pytest.fixture(scope="session") def dut(): dut = Dut() dut.init() yield dut dut.deinit() @pytest.fixture(scope="function", autouse=True) def dut_info(request, dut): ...... dut.collect_info() yield if request.node.rep_call.failed: ...... dut.dump_fail_info() ...... dut.collect_info()
现象:此时logging.info无法在终端打印,但满足以下任一条件时日志恢复正常:
- 将
dut_info的autouse设为False - 修改
dut_info使其不依赖dutfixture,如下:
@pytest.fixture(scope="function", autouse=True) def dut_info(request): ...... yield if request.node.rep_call.failed: ...... ......
检查
Dut类方法是否修改了logging配置
重点查看dut.init()、dut.collect_info()方法:有没有重新设置日志级别、替换/移除StreamHandler,或是将日志输出定向到文件等其他流。可以在这些方法执行前后分别打印logging.root.handlers和logging.getLogger().level,对比配置变化。排查session级fixture与日志初始化的顺序冲突
pytest的log_cli在测试会话启动阶段完成初始化,而session级的dutfixture会在会话早期执行。如果Dut.init()里自行初始化了logging,可能覆盖pytest的log_cli配置。可以尝试在dutfixture中显式复用pytest的日志handler,或是在Dut.init()中避免修改全局logging配置。检查fixture中的异常是否吞掉日志
查看dut.collect_info()、dut.dump_fail_info()里有没有捕获异常但未处理的情况,这类异常可能中断日志输出流程。可以在这些方法调用处包裹try-except打印异常信息,或是临时用print替代logging.info验证输出是否正常。验证pytest日志捕获机制的优先级
在测试用例和fixture中同时输出logging.info和print,如果print正常但日志不显示,说明是日志配置或捕获规则的问题。也可以在pytest.ini中显式指定日志格式:log_cli_format=%(asctime)s %(levelname)s %(message)s,强制触发log_cli的输出逻辑。排除其他插件或配置干扰
暂时禁用所有pytest第三方插件(用命令pytest -p no:all运行),如果日志恢复正常,说明是某个插件修改了日志行为。逐个启用插件排查,定位问题来源。
内容的提问来源于stack exchange,提问作者Ryan

