如何停止nosetests打印日志信息?

17 投票
4 回答
7808 浏览
提问于 2025-04-18 02:53

我该如何防止nosetests在测试输出中夹杂日志信息呢?我刚刚在我的Django代码中添加了日志功能,代码是这样的:

import logging
logger = logging.getLogger(__name__)

def home_page(request, template):
    device = get_device_capabilities(request)
    device_type = get_device_type(device)
    logger.info("device_type = " + device_type)
    logger.info("screen_width = " + str(screen_width))

当我这样运行测试时:

nosetests --nocapture

我得到的结果是:

[04/15/2014 02:42:57 PM] INFO [apps.home.views:24] device_type = computer
[04/15/2014 02:42:57 PM] INFO [apps.home.views:25] screen_width = 800
....................................................................................................................................................................................................................................
----------------------------------------------------------------------
Ran 230 tests in 42.521s

OK

我刚开始学习如何抛出异常和记录信息,我当然不想让我的测试输出被日志信息搞得乱七八糟。我以为使用“--nocapture”这个选项可以解决这个问题。我浏览了所有的nosetest文档,但没有找到其他能帮忙的内容。我是不是漏掉了什么?有没有办法让nosetests的输出不包含我的日志信息呢?

谢谢!

4 个回答

1

试试这个:

logging.disable(logging.CRITICAL) 或者 logging.disable(logging.NOTSET)

这样做会关闭指定严重程度的日志记录。

3

我建议你在你的 settings.py 文件里加一些这样的内容:

if 'test' in sys.argv:
    # disable loggers output
    LOGGING["loggers"] = {}

顺便说一下,我使用 nosedoctests 来进行测试,所以我的完整模板看起来是这样的:

if 'test' in sys.argv:
    # add Nose to INSTALLED_APPS for running tests
    INSTALLED_APPS = INSTALLED_APPS + ('django_nose',)
    TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
    NOSE_ARGS = ['--with-doctest']
    # change DB to sqlite3, when running test for speedup
    DATABASES['default'] = {'ENGINE': 'django.db.backends.sqlite3'}
    # disable loggers output
    LOGGING["loggers"] = {}

更新:我忘了说,我是用 python manage.py test 来运行测试的,这就是为什么我可以在 sys.argv 里提到 'test'

6

你可以随时使用 --logging-clear-handlers 这个命令来清除所有其他的日志处理器。

33

感谢那些回答我问题的人。我没有选择实现@amezhenin的方案,因为它和我测试的方式差别太大,我不想改变我的做法。@Oleksiy的方案虽然去掉了一些日志信息,但并没有全部去掉。我没有完全理解@gardenunez的意思,不过这可能是我自己的问题。

经过更多的研究,我意识到我之前指定的nosetest参数不对。其实不是我在最初问题中提到的--nocapture,而是--nologcapture。当我指定这个参数时,我的所有日志信息都被隐藏了。

撰写回答