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

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使其不依赖dut fixture,如下:
@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级的dut fixture会在会话早期执行。如果Dut.init()里自行初始化了logging,可能覆盖pytest的log_cli配置。可以尝试在dut fixture中显式复用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 18:25:19