pytest是否可以检查是否在错误级别或更高级别创建了日志条目? - python

Python 3.8.0,pytest 5.3.2,日志0.5.1.2。

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

我做过的大多数Google搜索都显示了如何在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语句会使测试失败,并且不会出现错误,并将[]打印到stdout,将log critical打印到stderr。

编辑2:

我发现了为什么失败了。从caplog的文档中:

caplog.records属性仅包含当前阶段的记录,因此在设置阶段内部,它仅包含设置日志,与调用和拆卸阶段相同

但是,下面是我应该第一次发现的内容:

要访问其他阶段的日志,请使用caplog.get_records(when)方法。例如,如果您要确保使用某种固定装置的测试永远不会记录任何警告,则可以在拆卸期间检查设置和调用阶段的记录,如下所示:

@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是标准的日志记录类型,因此您可以使用任何need there

这是您可以使用autouse固定装置自动执行此操作的一种方法:

@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 uuid4,如何限制唯一字符的长度 - python

在Python中,我正在使用uuid4()方法创建唯一的字符集。但是我找不到将其限制为10或8个字符的方法。有什么办法吗?uuid4()ffc69c1b-9d87-4c19-8dac-c09ca857e3fc谢谢。 参考方案 尝试:x = uuid4() str(x)[:8] 输出:"ffc69c1b" Is there a way to…

Python:无法识别Pip命令 - python

这是我拍摄的屏幕截图。当我尝试在命令提示符下使用pip时,出现以下错误消息:pip无法识别为内部或外部命令,可操作程序或批处理文件。我已经检查了这个线程:How do I install pip on Windows?我所能找到的就是我必须将"C:\PythonX\Scripts"添加到我的类路径中,其中X代表python版本。如您在我的…

Python:如何将有效的uuid从String转换为UUID? - python

我收到的数据是 { "name": "Unknown", "parent": "Uncategorized", "uuid": "06335e84-2872-4914-8c5d-3ed07d2a2f16" }, 我需要将uuid从Strin…

Python 3会流行吗? - python

我已经学习了一些Python 2和Python 3,似乎Python 2总体上比Python 3更好。这就是我的问题所在。是否有充分的理由真正切换到python 3? 参考方案 总体上,甚至在大多数细节上,Python3都比Python2更好。关于第三方库, Python 3落后于的唯一区域是。使Python变得如此出色的原因不仅在于它作为一种语言的内在特性…

Python-如何检查Redis服务器是否可用 - python

我正在开发用于访问Redis Server的Python服务(类)。我想知道如何检查Redis Server是否正在运行。而且如果某种原因我无法连接到它。这是我的代码的一部分import redis rs = redis.Redis("localhost") print rs 它打印以下内容<redis.client.Redis o…