微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python-pytest日志记录到文件和标准输出

我正在尝试在PyTest测试中设置日志,以将所有内容输出到stderr和文件.该文件应该获得每个日志级别,但是stderr应该具有更高的阈值(PyTest将使用其通常的捕获设置来对其进行管理).

我有pytest-logbook插件.这会将stderr重定向到PyTest捕获中,但是我不确定如何添加文件输出.

这(对希望了解日志的人来说)很明显,但这对我来说是新的.

还有一件事,我希望文件记录是实时的.我的测试通常运行时间长,当我需要查看是否挂起时,PyTest的仅显示故障输出的正常行为无济于事.

这是我认为应该起作用的代码,但无效.我得到了日志文件,但没有输出到stdout / stderr(即使失败):

conftest.py:

import os
import pytest
import logbook
import sys

@pytest.fixture(scope='module')
def modlog(request):
    """Logger that also writes to a file."""
    name = request.module.__name__
    if name.startswith('test_'):
        name = name[5:]
    logname = 'TEST-'+name+'.log'
    if os.path.exists(logname):
        os.rename(logname, logname+"~")
    logger = logbook.Logger(name)
    logger.handlers.append(logbook.FileHandler(logname, level='DEBUG'))
    logger.handlers.append(logbook.StreamHandler(sys.stdout, level='INFO'))
    logger.warn("Start of logging")
    return logger

test_loggy.py:

import pytest

def test_foo(modlog):
    modlog.info('hello')
    modlog.info('world')
    assert 0                       # logs will only print on test fail

解决方法:

回答我自己的问题(以防其他人碰到同样的事情).

日志处理程序形成一个堆栈,您必须允许消息“冒泡”通过.创建处理程序时,这是一个选项.

因此,处理程序的创建应为:

logger.handlers.append(logbook.FileHandler(logname, level='DEBUG', bubble=True))
logger.handlers.append(logbook.StreamHandler(sys.stderr, level='INFO', bubble=True))

如果您运行py.test -s,那么您将实时看到信息级别的消息.如果测试失败,则日志插件显示失败测试的所有日志消息(包括调试).您还将在文件中(实时)获得一个副本.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐