2

我有一个 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根本没有创建,并且没有错误消息或其他迹象表明出了问题。

我怎样才能使这项工作?

4

1 回答 1

3

先说两个事实:

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

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

这意味着调用logging.basicConfig(filename='.\\test.log', level=logging.INFO)fixture不会做任何事情,因为测试运行已经开始,并且根记录器具有附加的处理程序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. 配置和使用实时日志记录。中的配置pyproject.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夹具中移除。

于 2021-03-12T09:01:16.310 回答