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
根本没有创建,也没有错误消息或其他指示出了问题。
我怎样才能完成这项工作?
首先有两个事实:
logging.basicConfig()
只有在调用之前没有进行日志记录配置时才有效(目标记录器没有注册处理程序)。
pytest
将自定义处理程序注册到根记录器,以便能够捕获代码中发出的日志记录,因此您可以测试您的程序记录行为是否正确。
这意味着在固定装置中调用 logging.basicConfig(filename='.\test.log', level=logging.INFO)
不会执行任何操作,因为测试 运行 已经开始并且根记录器具有由 pytest
附加的处理程序。因此你有两个选择:
完全禁用内置 logging
插件。这将停止日志记录捕获 - 如果您在分析发出的日志的地方进行测试(例如使用 caplog
fixture),这些将停止工作。调用:
$ pytest -p no:logging ...
您可以在 pyproject.toml
中保留标志,以便自动应用:
[tool.pytest.ini_options]
addopts = "-p no:logging"
或 pytest.ini
:
[pytest]
addopts = -p no:logging
配置和使用live logging。 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
夹具中删除。
我有一个 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
根本没有创建,也没有错误消息或其他指示出了问题。
我怎样才能完成这项工作?
首先有两个事实:
logging.basicConfig()
只有在调用之前没有进行日志记录配置时才有效(目标记录器没有注册处理程序)。pytest
将自定义处理程序注册到根记录器,以便能够捕获代码中发出的日志记录,因此您可以测试您的程序记录行为是否正确。
这意味着在固定装置中调用 logging.basicConfig(filename='.\test.log', level=logging.INFO)
不会执行任何操作,因为测试 运行 已经开始并且根记录器具有由 pytest
附加的处理程序。因此你有两个选择:
完全禁用内置
logging
插件。这将停止日志记录捕获 - 如果您在分析发出的日志的地方进行测试(例如使用caplog
fixture),这些将停止工作。调用:$ pytest -p no:logging ...
您可以在
pyproject.toml
中保留标志,以便自动应用:[tool.pytest.ini_options] addopts = "-p no:logging"
或
pytest.ini
:[pytest] addopts = -p no:logging
配置和使用live logging。
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
夹具中删除。