在 Pytest 装置中使用时,Python 日志记录不会记录

问题描述

我有一个 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 固定装置),这些将停止工作。调用:

    $ 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 行。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...