如何忽略在 doctests 上的 pytest 期间生成的 structlog debug/info/etc?

How to ignore structlog debug/info/etc generated during pytest on doctests?

我正在尝试弄清楚如何在我的文档测试中忽略来自 structlog 的日志记录输出。似乎 pytest 能够忽略来自日志记录的日志,但不是来自 structlog(至少不是本机)。

示例如下:

import logging
import structlog


LOGGING_LOGGER = logging.getLogger(__name__)
STRUCTLOG_LOGGER = structlog.getLogger(__name__)


def func_with_logging():
    """
    >>> func_with_logging()
    1
    """
    LOGGING_LOGGER.debug("ABC")
    return 1


def func_with_structlog():
    """
    >>> func_with_structlog()
    1
    """
    STRUCTLOG_LOGGER.debug("ABC")
    return 1

以上仅在 structlog doctest 中失败。

========================================= test session starts =========================================
platform linux -- Python 3.9.4, pytest-7.1.2, pluggy-1.0.0
rootdir: /home/bbeattie/test
collected 2 items

myfile.py .F                                                                                    [100%]

============================================== FAILURES ===============================================
________________________________ [doctest] myfile.func_with_structlog _________________________________
019
020     >>> func_with_structlog()
Expected:
    1
Got:
    2022-05-07 18:32.13 [debug    ] ABC
    1

/home/bbeattie/test/myfile.py:20: DocTestFailure
======================================= short test summary info =======================================
FAILED myfile.py::myfile.func_with_structlog
===================================== 1 failed, 1 passed in 0.03s =====================================

我是否遗漏了一些明显的 pytest 标志?

您可以将 structlog 配置为不记录到 stdout,或者将其配置为使用标准库日志记录进行记录,以便 pytest 的日志记录助手工作。

https://www.structlog.org/en/stable/testing.html should be the simplest way to achieve the first approach, for the latter the "Rendering Within structlog" 方法中的 autouse fixture 应该可以工作。添加您自己的配置 structlog 的 autouse fixture(会话范围应该没问题,不需要为每个测试 re-configure)。