在Pycharm下运行django测试的记录输出

时间:2016-04-06 16:21:19

标签: django unit-testing logging pycharm

在PyCharm logging.logger消息下使用django.test.TestCase运行/调试单个测试时,不显示消息。我已按照How can I see log messages when unit testing in PyCharm?的建议尝试设置logging.basicConfig(level=logging.DEBUG),但这也没有帮助。我怀疑它可能是django TestCase设置干扰。

在测试设置或跑步者配置中是否还有其他方法可以打开测试运行的调试日志记录?

我现在在settings.py中设置的日志记录是:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
            'formatter': 'verbose'
        },
        'file': {
            'level': 'DEBUG',
            'class': 'logging.handlers.TimedRotatingFileHandler',
            'filename': '/var/log/em/mcqueen-dev.log',
            'when': 'midnight',
            'formatter': 'verbose',
        },
    },
    'formatters': {
        'verbose': {
            'format': '%(asctime)s.%(msecs).03d - %(process)d - %(thread)d - %(levelname)8s - %(filename)s:%(lineno)d - %(funcName)s - %(message)s'
        },
        'simple': {
            'format': '%(asctime)s - %(levelname)s %(message)s'
        },
    },
    'loggers': {
        'mcqueen_api': {
            'handlers': ['console', 'file'],
            'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG')
        },
        'mcqueen_app': {
            'handlers': ['console', 'file'],
            'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG')
        },
        'mcqueen_base': {
            'handlers': ['console', 'file'],
            'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG')
        },
    },
}

4 个答案:

答案 0 :(得分:3)

当我想在PyCharm中处理Django项目测试时看到日志时,我将这段代码放在带有test的文件中:

import logging
logger = logging.getLogger(__name__)
logging.disable(logging.NOTSET)
logger.setLevel(logging.DEBUG)

运行Django测试级别以禁用日志时设置为高(至50),降低它(如上面代码中的第3行)将导致显示日志(或保存到文件 - 取决于日志处理程序,正在使用)。

答案 1 :(得分:1)

stackoverflow上的

This thread解释了日志输出未显示到控制台的可能原因。显然,django的unittest runner替换了全局的sys.stdout / sys.stderr,但是从django设置指定的StreamHandler仍然与原始的sys.stdout / sys.stderr绑定。修复方法是在执行期间根据sys.stdout / sys.stderr的值为测试模块中的记录器添加流处理程序。

如果您希望记录器针对测试用例的所有方法登录到控制台,那么您可能最好使用自定义基类(请参阅链接到线程以获取更多详细信息)来包装在setUp中添加/删除的逻辑/拆卸。

我更喜欢使用装饰器而不是用于包装的各个测试方法。例如(使用SơnLâm答案提供的'django_test'记录器配置):

import logging
import sys
from contextlib import contextmanager

from django.test import TestCase

@contextmanager
def streamhandler_to_console(lggr):
    # Use 'up to date' value of sys.stdout for StreamHandler,
    # as set by test runner.
    stream_handler = logging.StreamHandler(sys.stdout)
    lggr.addHandler(stream_handler)
    yield
    lggr.removeHandler(stream_handler)

def testcase_log_console(lggr):
    def testcase_decorator(func):
        def testcase_log_console(*args, **kwargs):
            with streamhandler_to_console(lggr):
                return func(*args, **kwargs)
        return testcase_log_console
    return testcase_decorator

logger = logging.getLogger('django_test')

class SomeTestCase(TestCase):
    @testcase_log_console(logger)
    def test_something(self):    
        logger.info('show something to console.')

答案 2 :(得分:0)

我认为这将是有效的

在settings.py上记录配置

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'verbose': {
    'format': "[%(asctime)s] %(levelname)s %(message)s",
                'datefmt': "%d/%b/%Y %H:%M:%S"
            }
        },
        'handlers': {
            'file': {
                'level': 'DEBUG',
                'class': 'logging.FileHandler',
                'filename': '/var/log/django_practices.log',
                'formatter': 'verbose'
            },
            'console': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',
                'stream': sys.stdout,
                'formatter': 'verbose'
            },
        },
        'loggers': {

            'django_test': {
                'handlers': ['file', 'console'],
                'level': 'DEBUG',
            },
            'name_your_app': {
                'handlers': ['file', 'console'],
                'level': 'DEBUG',
            }

        }
    }

在UnitTest文件中

import logging
logger = logging.getLogger('django_test')
logger.info('test_log')

Log将会出现。

答案 3 :(得分:0)

我认为这与您正在使用的测试运行器有关 - 假设您在PyCharm中使用内置的Django测试设置,那么它应该已经设置了一个环境变量PYTHONUNBUFFERED=1我认为这是什么直接输出打印而不进行缓冲,只显示在最后(这是我认为正在发生的事情)。检查这是否在测试配置中设置,如果不是,请尝试。

另请参阅:Pycharm unit test interactive debug command line doesn't work(特别是如果您使用不同的测试运行器)