zoukankan      html  css  js  c++  java
  • Pytest权威教程20-日志

    返回: Pytest权威教程

    记录日志

    Pytest默认捕获WARNING以上日志消息,在每个失败的测试结果概要中,捕获的log信息和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及日志捕获:

    pytest --show-capture=no
    

    caplog Fixture方法

    在内部测试中,可以更改捕获的日志消息的日志级别。这由caplog夹具支持:

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

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

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

    测试结束时,将自动恢复设置的日志级别。

    也可以使用上下文管理器临时更改with块内的日志级别:

    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实例和最终日志文本的形式在Fixture上可用。当您要声明消息的内容时,这很有用:

    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阶段内,它仅包含设置日志,与call和 teardown阶段相同。

    要访问其他阶段的日志,请使用caplog.get_records(when)方法。举个例子,如果你想确保它使用某种固定的测试永远不能登录任何警告,您可以检查的记录setup,并call像这样拆卸过程中的阶段:

    @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如果没有提供,但只被应用到控制台日志处理程序。

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

    • log_cli_level
    • log_cli_format
    • log_cli_date_format

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

    你还可以使用选项 -log-file-level来指定日志文件的日志记录级别。此设置接受python文档中显示的日志记录级别名称(即大写的名称)或对应的整数值。

    此外,还可以指定--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()以动态自定义log_file路径。目前这是一个实验性功能。
    (译者注:可以在conftest.py中使用Hook方法pytest_configure()来修改日志名称,示例如下:

    # conftest.py
    import os
    form datetime import datetime
    def pytest_configure(config):
        today = datetime.now().strftime('%Y%m%d')
        config.option.log_file = os.path.join(config.rootdir, 'logs', f'{today}.log')
    

    )

    版本改动记录

    日志功能的引入代替了之前版本使用pytest-catchlog插件来记录日志的方式。两者相互冲突,Pytest已不再向后兼容pytest-capturelog插件。如果仍然需要使用pytest-catchlog插件,可以通过pytest.ini添加以下内容来禁用内部日志功能。

    [pytest]
        addopts=-p no:logging
    

    Pytest3.4中不向后兼容的更改

    引入日志功能后,社区反馈了一些3.4版本与3.3版本的不兼容问题:

    除非log_level配置或--log-level命令行选项明确要求,否则日志级别将不再更改。这允许用户自己配置记录器对象。
    现在,默认情况下会禁用用例实时日志输出,并且可以通过配置log_cli为true来启用。启用后,用例运行结果的详细程度会增加,因此可以看到每个测试的日志记录。
    现在,实时日志已发送到sys.stdout并且不再需要-s命令行选项才能工作。
    如果要部分还原version的日志记录行为3.3,可以将以下选项添加到ini 文件中:

    [pytest]
    log_cli=true
    log_level=NOTSET
    

    有关导致此更改的讨论的更多详细信息,请参见问题#3013。

  • 相关阅读:
    寒假学习日报20
    寒假学习日报19
    Centos firewalld开放端口
    Full GC回收详解
    JVM调优6大步骤
    JVM的方法区和永久带是什么关系?
    sql优化的几种方式
    sentinel-dashboard安装、运行(ubuntu)
    RocketMQ工作原理
    linux:nohup 不生成 nohup.out的方法
  • 原文地址:https://www.cnblogs.com/superhin/p/11677408.html
Copyright © 2011-2022 走看看