gpt4 book ai didi

python - pytest 有没有办法检查是否在错误级别或更高级别创建了日志条目?

转载 作者:行者123 更新时间:2023-12-01 11:11:34 25 4
gpt4 key购买 nike

Python 3.8.0,pytest 5.3.2,日志记录 0.5.1.2。

我的代码有一个输入循环,为了防止程序完全崩溃,我捕获任何抛出的异常,将它们记录为关键,重置程序状态,然后继续运行。这意味着导致这种异常的测试不会完全失败,只要输出仍然是预期的。如果错误是测试代码的副作用但不影响主要测试逻辑,则可能会发生这种情况。然而,我仍然想知道该测试暴露了一个导致错误的错误。

我所做的大部分谷歌搜索都显示了如何在 pytest 中显示日志的结果,我正在这样做,但我不知道是否有办法在测试中公开日志,这样我就可以在任何测试中失败错误或严重级别的日志。

编辑:这是失败尝试的最小示例:
test.py :

import subject
import logging
import pytest

@pytest.fixture(autouse=True)
def no_log_errors(caplog):
yield # Run in teardown
print(caplog.records)
# caplog.set_level(logging.INFO)
errors = [record for record in caplog.records if record.levelno >= logging.ERROR]
assert not errors

def test_main():
subject.main()
# assert False
subject.py :

import logging
logger = logging.Logger('s')
def main():
logger.critical("log critical")

运行 python3 -m pytest test.py通过没有错误。
取消对 assert 语句的注释使测试失败且没有错误,并打印 []到标准输出,和 log critical到标准错误。

编辑2:

我找到了为什么会失败。从关于 caplog 的文档:

The caplog.records attribute contains records from the current stage only, so inside the setup phase it contains only setup logs, same with the call and teardown phases



然而,就在下面是我应该第一次发现的:

To access logs from other stages, use the caplog.get_records(when) method. As an example, if you want to make sure that tests which use a certain fixture never log any warnings, you can inspect the records for the setup and call stages during teardown like so:



@pytest.fixture
def window(caplog):
window = create_window()
yield window
for when in ("setup", "call"):
messages = [
x.message for x in caplog.get_records(when) if x.levelno == logging.WARNING
]
if messages:
pytest.fail(
"warning messages encountered during testing: {}".format(messages)
)


然而,这仍然没有区别,而且 print(caplog.get_records("call"))仍然返回 []

最佳答案

您可以使用 caplog fixture 构建类似的东西。

这是文档中的一些示例代码,它根据级别进行一些断言:

def test_baz(caplog):
func_under_test()
for record in caplog.records:
assert record.levelname != "CRITICAL"
assert "wally" not in caplog.text

record s 是标准的日志记录类型,你可以使用任何你喜欢的类型 need there

这是您可以使用 autouse 更自动地执行此操作的一种方法 fixture :
@pytest.fixture(autouse=True)
def no_logs_gte_error(caplog):
yield
errors = [record for record in caplog.get_records('call') if record.levelno >= logging.ERROR]
assert not errors

(免责声明:我是 pytest 的核心开发人员)

关于python - pytest 有没有办法检查是否在错误级别或更高级别创建了日志条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59742264/

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