Python 在 Pytest 夹具中使用时,日志记录不会记录

Python logging does not log when used inside a Pytest fixture

我有一个 Pytest + Selenium 项目,我想使用日志记录模块。

但是,当我像这样设置登录时conftest.py

@pytest.fixture(params=["chrome"], scope="class")
def init_driver(request):
    start = datetime.now()
    logging.basicConfig(filename='.\test.log', level=logging.INFO)
    if request.param == "chrome":
        options = ChromeOptions()
        options.add_argument("--start-maximized")
        web_driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
    if request.param == "firefox":
        web_driver = webdriver.Firefox(GeckoDriverManager().install())
    request.cls.driver = web_driver
    yield
    end = datetime.now()
    logging.info(f"{end}: --- DURATION: {end - start}")
    web_driver.close()

看起来 test.log 根本没有创建,也没有错误消息或其他指示出了问题。

我怎样才能完成这项工作?

首先有两个事实:

  1. logging.basicConfig() 只有在调用之前没有进行日志记录配置时才有效(目标记录器没有注册处理程序)。

  2. pytest 将自定义处理程序注册到根记录器,以便能够捕获代码中发出的日志记录,因此您可以测试您的程序记录行为是否正确。

这意味着在固定装置中调用 logging.basicConfig(filename='.\test.log', level=logging.INFO) 不会执行任何操作,因为测试 运行 已经开始并且根记录器具有由 pytest 附加的处理程序。因此你有两个选择:

  1. 完全禁用内置 logging 插件。这将停止日志记录捕获 - 如果您在分析发出的日志的地方进行测试(例如使用 caplog fixture),这些将停止工作。调用:

    $ pytest -p no:logging ...
    

    您可以在 pyproject.toml 中保留标志,以便自动应用:

    [tool.pytest.ini_options]
    addopts = "-p no:logging"
    

    pytest.ini:

    [pytest]
    addopts = -p no:logging
    
  2. 配置和使用live loggingpyproject.toml中的配置,相当于你的logging.basicConfig()调用:

    [tool.pytest.ini_options]
    log_file = "test.log"
    log_file_level = "INFO"
    

    pytest.ini中:

    [pytest]
    log_file = test.log
    log_file_level = INFO
    

    当然,在这种情况下,logging.basicConfig() 行可以从 init_driver 夹具中删除。