我正在执行一个简单的 Python Django 测试用例。问题很简单:我想使用记录器将信息(stdout)重定向到一个文件,并将失败/错误(stderr)重定向到另一个文件。
我知道我可以简单地通过定义记录器并使用它来打印消息来将标准输出打印到文件(即
logger.info('my debug message')
);但是,我还没有找到记录失败/错误的方法。我可以使用 Bash 重定向整个测试运行的输出(其中我是半成功的),但我知道有一种方法可以简化它并使用记录器为我完成所有后端工作。
这是我的记录器的示例:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s, %(module)s at line %(lineno)d:\n%(message)s'
},
},
'handlers': {
'app': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': 'logs/app.log',
'formatter': 'verbose'
},
'test': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': 'logs/test.log',
'formatter': 'verbose'
},
'test-fail': {
'level': 'ERROR',
'class': 'logging.FileHandler',
'filename': 'logs/test-fail.log',
'formatter': 'verbose',
}
},
'loggers': {
'app': {
'handlers': ['app'],
'level': 'DEBUG',
'propagate': True,
},
'test': {
'handlers': ['test', 'test-fail'],
'level': 'DEBUG',
'propagate': True,
},
},
}
假设我正在尝试将以下测试用例记录到记录器中指定的 logs/test-fail.log 文件中:
logger = logging.getLogger('test')
def test_this(self):
logger.debug('This message will print to the logs/test.log file')
self.assertTrue(False) # will fail
简而言之,我想使用记录器打印 Django TestCase 中的错误/失败,而不是使用 Bash 打印。另请注意,我可以使用默认记录器,但我想仅为测试用例定义一个错误记录器案例,并且我不希望默认情况下使用测试错误案例。
base.py
设置文件配置了记录器:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s, %(module)s at line %(lineno)d:\n%(message)s'
},
},
'handlers': {
'app': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': 'logs/app.log',
'formatter': 'verbose'
},
'test': {
'level': 'DEBUG',
'class': 'logging.FileHandler',
'filename': 'logs/test.log',
'formatter': 'verbose'
},
'test-fail': {
'level': 'ERROR',
'class': 'logging.FileHandler',
'filename': 'logs/test-fail.log',
'formatter': 'verbose',
}
},
'loggers': {
'app': {
'handlers': ['app'],
'level': 'DEBUG',
'propagate': True,
},
'test': {
'handlers': ['test', 'test-fail'],
'level': 'DEBUG',
'propagate': True,
},
},
}
因此,我创建了另一个专门用于测试的设置文件,名为
testing.py
,并调整了日志记录级别:
from .base import *
LOG_LEVEL='ERROR'
LOGGING['loggers']['app']['level'] = LOG_LEVEL
TEST_RUNNER = "redgreenunittest.django.runner.RedGreenDiscoverRunner"
然后,我运行测试:
python manage.py test --settings=app.settings.testing
希望有帮助。