python-3.x pytest log_cli +标准日志= breaks doctest

bxjv4tth  于 2023-05-19  发布在  Python
关注(0)|答案(1)|浏览(120)

我们正在使用pytest和python std logging,并在doctest s中进行了一些测试。我们希望启用log_cli,以使IDE中的调试测试更容易(让stderr流到“实时”控制台,以便当单步执行时可以看到日志语句输出)问题是,在“使用logging”(例如存在对logger.info("...")的调用等)log_cli=true之间似乎存在bug/迭代。
我没有看到任何其他标志或在文档中提到这一点,所以它似乎是一个错误,但希望有一个解决方案。
本测试模块通过:

# bugjar.py
"""
>>> dummy()
'retval'
"""
import logging
logger = logging.getLogger(__name__)
def dummy():
    # logger.info("AnInfoLog")  ## un-comment to break test
    return "retval"

但是取消注解(没有其他更改)logger.info(调用会导致失败:(除非我从pytest.ini中删除log_cli

002 >>> dummy()
Expected:
    'retval'
Got nothing

以下是我的命令行和相关版本输出:

(venv) $ ./venv/bin/pytest -c ./pytest.ini ./bugjar.py
======================================================================= test session starts ========================================================================
platform linux -- Python 3.8.5, pytest-6.2.2, py-1.10.0, pluggy-0.13.1
rootdir: -omitted-/test-unit, configfile: ./pytest.ini
plugins: forked-1.3.0, xdist-2.2.1, profiling-1.7.0
collected 1 item                                                                                                                                                   

bugjar.py::bugjar
 
bugjar.py::bugjar 
-------------------------------------------------------------------------- live log call ---------------------------------------------------------------------------
INFO     bugjar:bugjar.py:8 AnInfoLog
FAILED                                                                                                                                                       [100%]

============================================================================= FAILURES =============================================================================
_________________________________________________________________________ [doctest] bugjar _________________________________________________________________________
001 
002 >>> dummy()
Expected:
    'retval'
Got nothing

和我的pytest.ini(注意,注解正确,通过/失败不受日志文件或其他添加选项的使用影响

[pytest]
addopts = --doctest-modules # --profile --profile-svg 
norecursedirs = logs bin tmp* scratch venv* data
# log_file = pytest.log
log_cli = true
log_cli_level=debug

pytest.ini中删除log_cli*可以解决问题。
这似乎与log_cli正在操作的东西有关,它捕获了用于doctest本身的输出,但也不是预期的行为。
我希望我犯了一个错误,或者有一个解决方法可以在bash或IDE shell窗口/调试器中获得实时日志输出。

fdbelqdn

fdbelqdn1#

抱歉theY4Kman从GitHub重新发布您的解决方案(请自己发布,我会删除我的):
解决这个问题的一种方法是使用pytest_runtest_call钩子禁用doctest项目的捕获:

import sys

from _pytest.config import hookimpl
from _pytest.doctest import DoctestItem
from _pytest.nodes import Item

@hookimpl(hookwrapper=True)
def pytest_runtest_call(item: Item) -> None:
    """Hook to suspend global capture when running doctests"""
    if isinstance(item, DoctestItem):
        capman = item.config.pluginmanager.getplugin('capturemanager')
        if capman:
            capman.suspend_global_capture(in_=True)
            out, err = capman.read_global_capture()
            sys.stdout.write(out)
            sys.stderr.write(err)

    yield

相关问题