簡體   English   中英

Python 在 pytest 中運行時停用 loguru.logger.catch() 函數

[英]Python deactivate loguru.logger.catch() function when run in pytest

我正在使用 loguru.logger.catch() 函數來記錄一些輸出。 另外,當我使用 pytest 測試我的課程時,我想停用此功能。 我試過使用猴子補丁,但沒有用。 我該如何處理這種情況?

示例代碼:

class DividerClass:

    @logger.catch
    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2

        if self.num2 == 0:
            raise ZeroDivisionError
        else:
            self.result = self.num1 / self.num2
            logger.info(f"DividerClass {self.num1} / {self.num2} = {self.result}")


def test_divider_class_with_zero(monkeypatch):
    monkeypatch.setattr(loguru.logger, "catch", lambda x: x)
    
    with pytest.raises(ZeroDivisionError):
        DividerClass(0, 0)

您可以嘗試使用 loguru 禁用方法 logger.disable logger.disable(None)

根據您的代碼結構,您可以傳遞模塊的名稱而不是 None 來禁用該模塊的日志記錄。

使用logger.enable(...)之后,您可以為其他測試重新啟用日志記錄。

有關更多詳細信息,請參閱禁用方法的 loguru 文檔

問題歸結為何應用裝飾器。 到測試收集完成時,裝飾器已經應用於函數。 因此,我們有兩種選擇:

  1. 修補導入所需的對象
  2. 打補丁重新加載模塊

在下面的代碼中,我展示了前一種方法。 此代碼還假定您的測試文件位於與實際代碼不同的文件中。

# src/manager.py

from loguru import logger

class DividerClass:

    @logger.catch
    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2

        if self.num2 == 0:
            raise ZeroDivisionError
        else:
            self.result = self.num1 / self.num2
            logger.info(f"DividerClass {self.num1} / {self.num2} = {self.result}")


# tests/test_manager.py

import pytest
import loguru

def test_divider_class_with_zero(monkeypatch):
    monkeypatch.setattr(loguru.logger, "catch", lambda x: x)
    # notice the import happens after the patch
    from src.manager import DividerClass
    
    with pytest.raises(ZeroDivisionError):
        DividerClass(0, 0)

=============================================== test session starts ================================================
platform darwin -- Python 3.8.9, pytest-7.0.1, pluggy-1.0.0
rootdir: ***
plugins: asyncio-0.18.3, xdist-2.5.0, forked-1.4.0, hypothesis-6.48.1, mock-3.7.0
asyncio: mode=strict
collected 1 item                                                                                                   

tests/test_manager.py .                                                                                      [100%]

================================================ 1 passed in 0.02s =================================================

在此處閱讀此出色答案以了解更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM