登录

pytest捕获级别的日志消息 WARNING 或更高版本自动显示,并以捕获stdout和stderr的相同方式在各自的部分中显示每个失败的测试。

无选项运行:

pytest

显示失败的测试,如:

----------------------- Captured stdlog call ----------------------
test_reporting.py    26 WARNING  text going to logger
----------------------- Captured stdout call ----------------------
text going to stdout
----------------------- Captured stderr call ----------------------
text going to stderr
==================== 2 failed in 0.02 seconds =====================

默认情况下,每个捕获的日志消息显示模块、行号、日志级别和消息。

如果需要,可以通过传递特定格式选项,将日志和日期格式指定给日志模块支持的任何内容:

pytest --log-format="%(asctime)s %(levelname)s %(message)s" \
        --log-date-format="%Y-%m-%d %H:%M:%S"

显示失败的测试,如:

----------------------- Captured stdlog call ----------------------
2010-04-10 14:48:44 WARNING text going to logger
----------------------- Captured stdout call ----------------------
text going to stdout
----------------------- Captured stderr call ----------------------
text going to stderr
==================== 2 failed in 0.02 seconds =====================

这些选项也可以通过 pytest.ini 文件:

[pytest]
log_format = %(asctime)s %(levelname)s %(message)s
log_date_format = %Y-%m-%d %H:%M:%S

此外,还可以完全禁用对失败测试中捕获的内容(stdout、stderr和logs)的报告,方法是:

pytest --show-capture=no

拼图夹具

在测试中,可以更改捕获的日志消息的日志级别。这是由 caplog 固定装置:

def test_foo(caplog):
    caplog.set_level(logging.INFO)
    pass

默认情况下,级别是在根日志记录器上设置的,但是为了方便起见,也可以设置任何记录器的日志级别:

def test_foo(caplog):
    caplog.set_level(logging.CRITICAL, logger="root.baz")
    pass

日志级别集将在测试结束时自动还原。

It is also possible to use a context manager to temporarily change the log level inside a with block:

def test_bar(caplog):
    with caplog.at_level(logging.INFO):
        pass

同样,默认情况下,根日志记录器的级别会受到影响,但任何记录器的级别都可以更改为:

def test_bar(caplog):
    with caplog.at_level(logging.CRITICAL, logger="root.baz"):
        pass

最后,在测试运行期间发送给记录器的所有日志都以 logging.LogRecord 实例和最终日志文本。当您要对消息的内容进行断言时,这很有用:

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

有关日志记录的所有可用属性,请参阅 logging.LogRecord 类。

你也可以求助于 record_tuples 如果您所要做的只是确保某些消息已以给定的记录器名称记录,并且具有给定的严重性和消息:

def test_foo(caplog):
    logging.getLogger().info("boo %s", "arg")

    assert caplog.record_tuples == [("root", logging.INFO, "boo arg")]

你可以打电话 caplog.clear() 要在测试中重置捕获的日志记录,请执行以下操作:

def test_something_with_clearing_records(caplog):
    some_method_that_creates_log_records()
    caplog.clear()
    your_test_method()
    assert ["Foo"] == [rec.message for rec in caplog.records]

这个 caplog.records 属性只包含当前阶段的记录,因此在 setup 阶段它只包含安装日志,与 callteardown 阶段。

要从其他阶段访问日志,请使用 caplog.get_records(when) 方法。例如,如果要确保使用某个fixture的测试从不记录任何警告,可以检查记录中的 setupcall 拆卸过程中的阶段如下:

@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)
            )

完整的API可在 _pytest.logging.LogCaptureFixture .

活原木

通过设置 log_cli 配置选项到 true ,pytest将在日志记录直接发送到控制台时输出这些记录。

您可以指定日志级别,通过传递将具有相同或更高级别的日志记录打印到控制台。 --log-cli-level . 此设置接受日志级别名称(如python文档中所示)或整数作为日志级别num。

此外,还可以指定 --log-cli-format--log-cli-date-format 哪个镜像默认为 --log-format--log-date-format 如果未提供,但仅应用于控制台日志记录处理程序。

所有的cli日志选项也可以在配置ini文件中设置。选项名称为:

  • log_cli_level

  • log_cli_format

  • log_cli_date_format

如果需要将整个测试套件日志记录调用记录到一个文件中,则可以通过 --log-file=/path/to/log/file . 此日志文件以写模式打开,这意味着它将在每个运行测试会话中被覆盖。

还可以通过传递来指定日志文件的日志级别 --log-file-level . 此设置接受在Python文档中看到的日志级别名称(即大写级别名称)或整数作为日志级别num。

此外,还可以指定 --log-file-format--log-file-date-format 等于 --log-format--log-date-format 但应用于日志文件日志记录处理程序。

所有日志文件选项也可以在配置ini文件中设置。选项名称为:

  • log_file

  • log_file_level

  • log_file_format

  • log_file_date_format

你可以调用 set_log_path() 动态自定义日志文件路径。考虑到该功能 实验的 .

发行说明

此功能是作为 pytest-catchlog 插件和它们相互冲突。向后兼容API pytest-capturelog 在引入此功能时已删除,因此如果出于此原因仍需要 pytest-catchlog 您可以通过添加到 pytest.ini

[pytest]
    addopts=-p no:logging

Pytest 3.4中的不兼容更改

此功能是在 3.3 还有一些 不兼容的更改 已经制成 3.4 社区反馈后:

  • 日志级别不再更改,除非 log_level 配置或 --log-level 命令行选项。这允许用户自己配置记录器对象。设置 log_level 将设置全局捕获的级别,因此如果特定测试需要低于此级别的级别,请使用 caplog.set_level() 否则测试很容易失败。

  • Live Logs 现在默认情况下已禁用,并且可以启用设置 log_cli 配置选项到 true . 启用后,详细程度会增加,因此可以看到每个测试的日志记录。

  • Live Logs 现在发送到 sys.stdout 不再需要 -s 要工作的命令行选项。

如果要部分还原版本的日志记录行为 3.3 ,您可以将此选项添加到 ini 文件:

[pytest]
log_cli=true
log_level=NOTSET

有关导致此更改的讨论的更多详细信息,请参阅 #3013 .