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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM