pytest 測試輸出和結果-管理日志記錄

2022-03-29 17:25 更新

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 =====================

默認情況下,每個捕獲的日志消息都會顯示模塊、行號、日志級別和消息。

如果需要,可以通過傳遞特定的格式選項將日志和日期格式指定為日志模塊支持的任何內(nèi)容:

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

此外,可以通過以下方式完全禁用對失敗測試的捕獲內(nèi)容(?stdout?、?stderr ?和?logs?)的報告:

pytest --show-capture=no

caplog fixture

在測試內(nèi)部,可以更改捕獲的日志消息的日志級別。這是由?caplog fixture?支持的:

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

默認情況下,級別是在根記錄器上設置的,但是為了方便起見,也可以設置任何記錄器的日志級別:

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

設置的日志級別會在測試結束時自動恢復。

也可以使用上下文管理器臨時更改 ?with塊內(nèi)的日志級別:

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

最后,在測試運行期間發(fā)送給記錄器的所有日志都可以在?fixture?上以日志記錄的形式獲得。當你想要對消息的內(nèi)容進行斷言時,這很有用:

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

如果您只想確保某些消息已記錄在具有給定嚴重性和消息的給定記錄器名稱下,您還可以使用 ?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? 屬性僅包含來自當前階段的記錄,因此在設置階段內(nèi)它僅包含設置日志,與調用和拆卸階段相同。

要從其他階段訪問日志,請使用?caplog.get_records(when)?方法。例如,如果你想確保使用某個?fixture?的測試不會記錄任何警告,你可以像這樣檢查安裝和調用階段的記錄:

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

實時日志

通過將 ?log_cli配置選項設置為 ?true,pytest 將輸出日志記錄,因為它們直接發(fā)送到控制臺。

您可以通過傳遞 ?--log-cli-level? 指定將具有相同或更高級別的日志記錄打印到控制臺的日志記錄級別。 此設置接受 python 文檔中看到的日志記錄級別名稱或整數(shù)作為日志記錄級別 ?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 文檔中所見的日志級別名稱(即大寫的級別名稱)或整數(shù)作為日志級別 ?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()? 來動態(tài)自定義 ?log_file ?路徑。

自定義顏色

如果啟用了彩色終端輸出,則日志級別是彩色的。 通過 ?add_color_level()? 支持從默認顏色更改或在自定義日志級別上添加顏色。 例如:

@pytest.hookimpl
def pytest_configure(config):
    logging_plugin = config.pluginmanager.get_plugin("logging-plugin")

    # Change color on existing log level
    logging_plugin.log_cli_handler.formatter.add_color_level(logging.INFO, "cyan")

    # Add color to a custom log level (a custom log level `SPAM` is already set up)
    logging_plugin.log_cli_handler.formatter.add_color_level(logging.SPAM, "blue")

此功能是作為 ?pytest-catchlog? 插件的替代品引入的,它們相互沖突。 引入此功能時,帶有 ?pytest-capturelog? 的向后兼容性 API 已被刪除,因此如果您仍然需要 ?pytest-catchlog?,您可以通過添加到 ?pytest.ini? 來禁用內(nèi)部功能:

[pytest]
    addopts=-p no:logging


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號