首页 > 解决方案 > 即使禁用了日志文件捕获,Pytest 也会捕获日志文件

问题描述

运行 pytest--capture=sys应该只捕获 stdout/stderr,但如果我这样做--tb=auto --capture=sys,回溯仍然包括应该只路由到日志文件的调试语句。即使使用-s.

我有很多调试语句被记录到我不想在控制台上看到的文件中。所以我将我的logging.StreamHandler记录器设置为logging.INFOlogging.FileHandler设置为logging.DEBUG.

当我运行测试时,如果出现故障并打印回溯,如果我使用and ,它总是会打印Captured log calland部分。阻止这种情况发生的唯一方法是使用,但随后我会丢失有价值的回溯信息。Captured stdout call--tb=auto--tb=short--tb=no

最小的例子(我称之为文件test_basic.py):

import logging

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

fh = logging.FileHandler(filename="log.txt")
fh.setLevel(logging.DEBUG)
logger.addHandler(fh)

sh = logging.StreamHandler()
sh.setLevel(logging.INFO)
logger.addHandler(sh)


def test_one():
    logger = logging.getLogger("test_one")
    logger.info("Logging at INFO level")
    logger.debug("Logging at DEBUG level")
    assert False

输出python -m pytest --tb=auto --capture=sys

==================================================== FAILURES ====================================================
____________________________________________________ test_one ____________________________________________________

    def test_one():
        logger = logging.getLogger("test_one")
        logger.info(f"Logging at INFO level")
        logger.debug(f"Logging at DEBUG level")
>       assert False
E       assert False

test_basic.py:19: AssertionError
---------------------------------------------- Captured stderr call ----------------------------------------------
Logging at INFO level
----------------------------------------------- Captured log call ------------------------------------------------
INFO     test_one:test_basic.py:17 Logging at INFO level
DEBUG    test_one:test_basic.py:18 Logging at DEBUG level
============================================ 1 failed in 0.09 seconds ============================================

期望的输出:

==================================================== FAILURES ====================================================
____________________________________________________ test_one ____________________________________________________

    def test_one():
        logger = logging.getLogger("test_one")
        logger.info(f"Logging at INFO level")
        logger.debug(f"Logging at DEBUG level")
>       assert False
E       assert False

test_basic.py:19: AssertionError
---------------------------------------------- Captured stderr call ----------------------------------------------
Logging at INFO level
============================================ 1 failed in 0.09 seconds ============================================

如果我使用--tb=no我会删除该Captured log call部分,但也会删除所有回溯信息:

============================================== test session starts ===============================================

test_basic.py F                                                                                            [100%]

============================================ 1 failed in 0.07 seconds ============================================

我怎样才能达到我的预期行为?

标签: loggingpytesttraceback

解决方案


答案是--show-capture=stdout

不过,禁用捕获并不会这样做,这有点令人困惑。我本来想-s覆盖--show-capture=all(默认)。


推荐阅读