gpt4 book ai didi

pytest 为每个测试方法实现一个日志文件

转载 作者:行者123 更新时间:2023-12-05 01:19:08 26 4
gpt4 key购买 nike

我想为每个测试方法创建一个单独的日志文件。我想在 conftest.py 文件中执行此操作并将日志文件实例传递给测试方法。这样,每当我在测试方法中记录某些内容时,它都会记录到一个单独的日志文件中,并且非常容易分析。

我尝试了以下方法。在 conftest.py 文件中我添加了这个:

logs_dir = pkg_resources.resource_filename("test_results", "logs")
def pytest_runtest_setup(item):
test_method_name = item.name
testpath = item.parent.name.strip('.py')
path = '%s/%s' % (logs_dir, testpath)
if not os.path.exists(path):
os.makedirs(path)
log = logger.make_logger(test_method_name, path) # Make logger takes care of creating the logfile and returns the python logging object.

这里的问题是 pytest_runtest_setup 没有能力返回任何东西给测试方法。至少,我不知道。

因此,我考虑在 conftest.py 文件中使用 scope="function"创建一个 fixture 方法,并从测试方法中调用这个 fixture。但是,fixture 方法不知道 Pytest.Item 对象。在 pytest_runtest_setup 方法的情况下,它接收 item 参数并使用它我们能够找出测试方法名称和测试方法路径。

求助!

最佳答案

我通过进一步研究 webh 找到了这个解决方案的回答。我尝试使用 pytest-logger但是他们的文件结构非常严格,对我来说并不是很有用。我找到了 this code无需任何插件即可工作。它基于 set_log_path,这是一项实验性功能。

Pytest 6.1.1 和 Python 3.8.4

# conftest.py

# Required modules
import pytest
from pathlib import Path

# Configure logging
@pytest.hookimpl(hookwrapper=True,tryfirst=True)
def pytest_runtest_setup(item):
config=item.config
logging_plugin=config.pluginmanager.get_plugin("logging-plugin")
filename=Path('pytest-logs', item._request.node.name+".log")
logging_plugin.set_log_path(str(filename))
yield

请注意,Path 的使用可以替换为 os.path.join。此外,可以在不同的文件夹中设置不同的测试,并通过在文件名上使用时间戳来记录历史上完成的所有测试。例如,可以使用以下文件名:

# conftest.py

# Required modules
import pytest
import datetime
from pathlib import Path

# Configure logging
@pytest.hookimpl(hookwrapper=True,tryfirst=True)
def pytest_runtest_setup(item):
...
filename=Path(
'pytest-logs',
item._request.node.name,
f"{datetime.datetime.now().strftime('%Y%m%dT%H%M%S')}.log"
)
...

此外,如果想修改日志格式,可以在 pytest 配置文件中进行更改,如 documentation 中所述。 .

# pytest.ini
[pytest]
log_file_level = INFO
log_file_format = %(name)s [%(levelname)s]: %(message)

我的第一个 stackoverflow 答案!

关于pytest 为每个测试方法实现一个日志文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41400722/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com