Pytest日志信息重复输出问题咨询
解决pytest日志重复输出的问题
这个问题我之前排查过,核心原因是Python标准logging模块的默认处理程序(Handler)和pytest的CLI日志处理程序同时在工作,导致同一条日志被打印两次:
- 你在
pytest.ini里开启了log_cli=1,这会让pytest自动添加一个专属的CLI日志Handler,按照你配置的格式输出日志到控制台。 - 当你在
pytest_generate_tests钩子中调用logging.info()时,如果Python的根logger还没有任何Handler,它会自动创建一个默认的StreamHandler——这个Handler就是你看到的红色字体输出的来源,它和pytest的Handler各自输出一次,就造成了重复。
下面给你几个实用的解决方案,按需选就行:
方案1:移除Python logging的默认Handler
在conftest.py里的钩子函数中,先清理掉根logger的默认StreamHandler,只保留pytest的Handler:
import logging def pytest_generate_tests(metafunc): # 获取根日志器 root_logger = logging.getLogger() # 遍历并移除所有默认的StreamHandler for handler in list(root_logger.handlers): if isinstance(handler, logging.StreamHandler): root_logger.removeHandler(handler) # 现在日志只会通过pytest的log_cli配置输出 logging.info("This is generated during the test collection !!!")
方案2:使用pytest专属的日志器
直接调用pytest的内部日志器来输出,这样日志会走pytest的日志系统,不会触发Python的默认Handler:
import logging def pytest_generate_tests(metafunc): # 获取pytest专用的日志器 pytest_logger = logging.getLogger("pytest") pytest_logger.info("This is generated during the test collection !!!")
方案3:提前配置logging禁用默认Handler
在conftest.py的开头就配置logging,不让它自动创建默认的StreamHandler:
import logging # 初始化logging时传入空的handlers列表,避免默认创建StreamHandler logging.basicConfig(handlers=[], level=logging.INFO) def pytest_generate_tests(metafunc): logging.info("This is generated during the test collection !!!")
额外提示
你看到的红色字体输出,本质是Python默认StreamHandler的输出(部分终端环境会给日志级别加上颜色标识,或者你的环境把默认输出映射到了错误流),而另一次则是pytest按照pytest.ini配置生成的格式化输出。如果你的测试用例里也用到了logging,同样会遇到这个问题,所以建议统一用上面的方式处理日志配置。
内容的提问来源于stack exchange,提问作者surabhi
相关产品推荐
相关产品推荐

